Регулярные выражения

Russian main discussion
  • Author
  • Message
Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

YuS
Спасибо, логику уловил. Вроде часто стал пользоваться, но временами что-то как-то...
YuS wrote:А чтобы работал "ленивый" шаблон, необходимо убрать из выражения символ конца строки "$":
В этом случае, наверное, можно не убирать, в списке строки вида

Code: Select all

path\name1-x64.exe
path\name2-x64.exe
path\name3-x64.exe
path\name4-x64.exe
и с "$" выражение выглядет понятнее для меня.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Skif_off wrote: В этом случае, наверное, можно не убирать, в списке строки вида

Code: Select all

path\name1-x64.exe
path\name2-x64.exe
path\name3-x64.exe
path\name4-x64.exe
и с "$" выражение выглядет понятнее для меня.
Да, всё зависит от необходимости и достаточности. Наличие "^" и "$" - дает более строгие правила для совпадения, т.е. часть строки не будет найдена, только целиком строка (или несколько строк) должна совпасть с шаблоном.

Offline
Posts: 27
Joined: Sat Mar 20, 2010 11:27 am

Post by clever_man »

Не могу понять почему не срабатывает regexp до конца (правая скобка не выделяется). В akelpad в coder также левая скобка не окрашивается.
([A-CX-ZI-K]=IC)(\(-?\d{1,4}\.?\d{0,4}|-?\.\d{1,4}\))
Image

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

clever_man wrote:Не могу понять почему

Code: Select all

(\(-?\d{1,4}\.?\d{0,4}|-?\.\d{1,4}\))
(a|b)
a=\(-?\d{1,4}\.?\d{0,4}
b=-?\.\d{1,4}\)

Offline
Posts: 27
Joined: Sat Mar 20, 2010 11:27 am

Post by clever_man »

YuS wrote:
clever_man wrote:Не могу понять почему

Code: Select all

(\(-?\d{1,4}\.?\d{0,4}|-?\.\d{1,4}\))
(a|b)
a=\(-?\d{1,4}\.?\d{0,4}
b=-?\.\d{1,4}\)
Тьфу ты блин, слона-то я и не приметил)) Хвост изучил, а центральную часть нет))

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Ребята, надо удалить концевые табуляции и пробелы в строках, но только в тех, в которых есть текст, а те, которые полностью состоят из табуляций и пробелов, не трогать.
Есть регулярка: text.replace(/\S[ \t]*?$/gm, "")
но она в тех строках, где в конце нет пробелов, откусывает последний символ от текста.
Подскажите пожалуйста, что нужно изменить, чтобы это заработало?

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

VladSh
Непробельный символ (\S) тоже часть найденного (соответствия) и при замене на пустую строку (, "") он теряется.
Используйте скобки и обратные ссылки. Например, для стандартного диалога замены сработает такое:
Что: (\S)([ \t])*?$
Чем: \1

UPD:
для скрипта сработало так:

Code: Select all

var hWndEdit=AkelPad.GetEditWnd();
AkelPad.TextReplace(hWndEdit, "(\\S)([ \\t]*?$)", "\\1", 0x00280001, true);

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote: Есть регулярка: text.replace(/\S[ \t]*?$/gm, "")
но она в тех строках, где в конце нет пробелов, откусывает последний символ от текста.
Подскажите пожалуйста, что нужно изменить, чтобы это заработало?
Помимо предложенного выше способа, можно сделать так:

Code: Select all

text.replace(/\S\K[ \t]*?$/gm, "")

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

YuS wrote:Помимо предложенного выше способа, можно сделать так
Восхитительно!

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

opk44 wrote:Восхитительно!
Да чего тут восхитительного? :) Этот метасимвол Instructor уже давненько добавил в работу.

Только вот, обнаружился баг... что-то с памятью моей стало, вроде бы уже кто-то писал о подобном.
Ну а если нет, то:

Code: Select all

Что: \S\K[ \t]*?$
Чем:

Code: Select all

dkjgsdugf	 	 	
	 	 	 	 	 	
f	
` 

- при пошаговой замене, вхождение находит, но не заменяет.
- при нажатии "Заменить всё", отрабатывает нормально.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

opk44, YuS
Спасибо, ребята!
Временно остановился на варианте opk44. Хотелось бы узнать, когда будет исправление для 2-го варианта чтобы его начать использовать, т.к. из скрипта не сработало.

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

VladSh
т.к. из скрипта не сработало.
А Вы в каком виде это выражение пробуете?

Code: Select all

text.replace(/\S\K[ \t]*?$/gm, "")
Так оно, кажется, и не должно сработать, т.к. это jscript-овская функция, а в синтаксисе регулярок для jscript вроде нет метапоследовательности \K. Оно сработает только в функции AkelPad.TextReplace

Code: Select all

AkelPad.TextReplace(hWndEdit, "\\S\\K[ \\t]*?$", "", 0x00280001, true);
А для text.replace только вариант opk44, только можно, имхо, *? на + заменить:

Code: Select all

text.replace(/(\S)[\x20\t]+$/gm,"$1")

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote:т.к. из скрипта не сработало.
2-ой - это какой? Который с "\K"?
Вот так должно сработать:

Code: Select all

AkelPad.TextReplace(0, "\\S\\K[ \\t]*?$", "", 0x00280001, true);
PS Пока сочинял, уже ответили, но пусть тоже останется :)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

YuS
TextReplace не подходит - надо работать с программно полученным текстом. Остался на предыдущем варианте.
yozhic wrote:только можно, имхо, *? на + заменить
Этот вариант чем-то корректнее? Просто предыдущий вроде как работает без глюков..

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote:
yozhic wrote:только можно, имхо, *? на + заменить
Этот вариант чем-то корректнее? Просто предыдущий вроде как работает без глюков..
Принципиальных отличий нет, но по смыслу корректнее искать вхождения с конечными пробельными символами, как минимум с одним. Просто нет смысла заменять то, чего нет... и квантификатор ленивости тут необязателен, скорее наоборот, для ускорения лучше сверхжадность добавить... но тут опять же возникает вопрос: а работает ли это в javascript? Ведь вышеупомянутый "\K", например, там, действительно, отсутствует и сверхжадность, вроде бы, тоже...
Post Reply