1

Тема: JS: Регулярные выражения

Задача. Есть файл такого содержания:

...
Start: Дата время
...
User=<Пользователь1>
...
Stop: Дата время
...
Start: Дата время
...
User=<Пользователь2>
...
Stop: Дата время
...

Таких записей по каждому пользователю может быть несколько.
Нужно получить информацию по конкретному пользователю (допустим, <Пользователь1>) такого содержания:

Start: Дата время
Stop: Дата время

Start: Дата время
Stop: Дата время
...

Помогите, пожалуйста, написать регулярное выражение.

2

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

Крепыш, выложите образец конкретного файла (в архиве, разумеется; сюда или на RGhost).

3

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

К сожалению, оригинал выложить не могу. Сгенерировал тестовый файл.
Надо из него вытащить все

Start: Дата время
Stop: Дата время

в которых User=Admin

Post's attachments

test.txt 669 b, 12 downloads since 2013-07-17 

You don't have the permssions to download the attachments of this post.

4

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

У меня вышла примерно такая болванка кода (на VBScript; перевод будет Ваш):

Option Explicit

Dim strUser
Dim strContent
Dim objMatch


strUser = "Admin"

With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Песочница\020\test.txt")
    strContent = .ReadAll()
    .Close
End With

With WScript.CreateObject("VBScript.RegExp")
    .Global     = True
    .IgnoreCase = True
    .Pattern    = "(Start: \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})\r\nOS=.*\r\nUSER=" & strUser & "\r\n\r\n(Stop: \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})\r\n"
    
    If .Test(strContent) Then
        WScript.Echo "User: " & strUser
        WScript.Echo "--------------------------"
        
        For Each objMatch In .Execute(strContent)
            WScript.Echo objMatch.Submatches(0), objMatch.Submatches(1)
        Next
    End If
End With

WScript.Quit 0
+ Результат
User: Admin
--------------------------
Start: 15.02.2013 23:05:58 Stop: 18.02.2013 11:34:40
Start: 04.03.2013 17:34:34 Stop: 04.03.2013 17:36:52
Start: 04.03.2013 17:38:19 Stop: 04.03.2013 17:41:02

5 (изменено: Rumata, 2013-07-18 04:03:40)

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

cscript user_info.js < test.txt


var lines = WScript.StdIn.ReadAll();

var re = /(Start: .+?)\r\nOS=.+?\r\nUSER=Admin\r\n\r\n(Stop: .+?)\r\n/g;

var r;
while ( r = re.exec(lines) ) {
    WScript.Echo(r[1] + '\t' + r[2]);
}

Пользуясь случаем хочу сказать, что утилиты командной строки, пришедшие из мира unix (например из пакетов UnxUtils, GnuWin32, Cygwin) делают аналогичную задачу, например так:


grep Admin -B 2 -A 2 test.txt | grep -e Start -e Stop | sed "N;s/\n/\t/"

или так:


grep Admin -B 2 -A 2 test.txt | grep -e Start -e Stop | paste - -

а можно и так:


grep Admin -B 2 -A 2 test.txt | grep -e Start -e Stop | xargs -n6
( 2 * b ) || ! ( 2 * b )

6 (изменено: alexii, 2013-07-18 13:45:13)

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

Rumata, а «?» в «(Start: .+?)» и в «(Stop: .+?)» — зачем?

7

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


.+?
. - некие символы
+ - хотя бы один
? - если есть много, то не брать все сразу

Из предположения, что все-таки формат даты/времени может быть изменен.

( 2 * b ) || ! ( 2 * b )

8

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

Я к тому, что «.» в WSH — «…except a newline character», то бишь всё равно за границу «\n» этот шаблон не перескочит — а у нас как раз такой случай.

9 (изменено: Крепыш, 2013-07-18 12:31:52)

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

alexii, Rumata,
спасибо!

alexii пишет:

Rumata, а «+» в «(Start: .+?)» и в «(Stop: .+?)» — зачем?

Без «+» будет искаться строка «Start: » или «Stop: » плюс один любой символ перед переводом на новую строку, что даст нулевой результат.


Но хотелось бы сделать это более общим выражением. Т.е., используя только опорные строки Start:, Stop:, User=Admin без указания конкретного количества строк между ними.

Пробовал сделать вот таким регулярным выражением

/(Start: \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})[\S\s]+?USER=Admin[\S\s]+?(Stop: \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})/g

либо

/(Start: .+?)\r[\S\s]+?USER=Admin[\S\s]+?(Stop: .+?)\r/g

Но оно захватывает несколько больше, чем нужно.

10

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

/регулярное выражение/gm
должно сработать

( 2 * b ) || ! ( 2 * b )

11

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

Rumata пишет:

/регулярное выражение/gm
должно сработать

Неа, результат тот же.

12 (изменено: Rumata, 2013-07-18 12:41:31)

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

Проверяйте. Подставьте Ваше регулярное выражение вместо соответствующей фразы из моего примера.

( 2 * b ) || ! ( 2 * b )

13

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

Так я ж проверил. Результат:

Start: 15.02.2013 14:43:33      Stop: 18.02.2013 11:34:40
Start: 04.03.2013 08:22:28      Stop: 04.03.2013 17:36:52
Start: 04.03.2013 17:38:19      Stop: 04.03.2013 17:41:02

Т.е., выводится строка с первым вхождением Start, далее Stop, который попадается первым после User=Admin. К стопам претензий нет, а вот старты - не те.

14

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

Rumata, Крепыш, приношу всем извинения. Думал одно, написал другое. Речь шла, конечно же, не о «+», а о «?». Поправил свой пост.

Rumata, на мой взгляд, там «?» не нужен.

15

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

Крепыш, у меня на Вашем примере и коде коллеги Rumata всё нормально:

Start: 15.02.2013 23:05:58      Stop: 18.02.2013 11:34:40
Start: 04.03.2013 17:34:34      Stop: 04.03.2013 17:36:52
Start: 04.03.2013 17:38:19      Stop: 04.03.2013 17:41:02

16

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

Но хотелось бы сделать это более общим выражением. Т.е., используя только опорные строки Start:, Stop:, User=Admin без указания конкретного количества строк между ними.

Крепыш, к сожалению, lookbehind в VBScript RegExp не поддерживается.

17

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

Крепыш, мне вот тут подумалось: а мы не будем выбирать по пользователю, будем выбирать все значения, а затем будем отсеивать ненужные:

Option Explicit

Dim strUser
Dim strContent
Dim objMatch


strUser = "Admin"

With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Песочница\020\test.txt")
    strContent = .ReadAll()
    .Close
End With

With WScript.CreateObject("VBScript.RegExp")
    .Global     = True
    .IgnoreCase = True
    .Pattern    = "(Start: \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})\r\n(?:.|\n)*?USER=(.*?)\r\n(?:.|\n)*?(Stop: \d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2})\r\n"
    
    If .Test(strContent) Then
        WScript.Echo "User: " & strUser
        WScript.Echo "--------------------------"
        
        For Each objMatch In .Execute(strContent)
            If objMatch.Submatches(1) = strUser Then
                WScript.Echo objMatch.Submatches(0), objMatch.Submatches(2)
            End If
        Next
    End If
End With

WScript.Quit 0

18

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

Крепыш
Проблема в том, что под регулярку /(Start: .+?)\r[\S\s]+?USER=Admin[\S\s]+?(Stop: .+?)\r/gm подпадает первое совпадение подстроки Start: дата, далее любое количество символов (включая все подстроки, содержащие Start: дата). Надо избежать попадания этой подстроки под шаблон [\S\s]+?. Следующая регулярка работает согласно Вашим последним требованиям:



var lines = WScript.StdIn.ReadAll();

var re = /(Start: \S+ \S+)(?:(?:(?!(?:Start|Stop): \S+ \S+)[\S\s])*)USER=Admin[\S\s]*?(Stop: \S+ \S+)/gm;

var r;
while ( r = re.exec(lines) ) {
    WScript.Echo(r[1] + '\t' + r[2]);
}

Аналогичная регулярка рассматривается у Фридла в его книге "Регулярные выражения", стр.190. Читается оно так:

подстрока, которая начинается с (Start: дата время)
далее любой символ [\S\s], если не совпадает с (?!(?:Start|Stop): дата время)
далее задано имя пользователя USER=Admin
далее подстрока завершается (Stop: дата время)

Эта регулярка описывает структуру данных вида


Start: дата время
что-то
USER=имя_пользователя
что-то еще
Stop: дата время
( 2 * b ) || ! ( 2 * b )

19

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

Rumata, превосходно! Работает.

20 (изменено: Крепыш, 2013-07-19 10:33:01)

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

Rumata, здорово! Спасибо большое!

А можно усложнить задачу?
Допустим, бывает, что строка Stop: отсутствует в некоторых временных интервалах (по какой-то причине время окончания не зафиксировалось). В этом случае нужно хотябы выписать время Start:

Start: дата время

Start: дата время
Stop: дата время

Как записать регулярное выражение для такой ситуации?

21 (изменено: Крепыш, 2013-07-19 11:38:25)

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

Крепыш пишет:

Как записать регулярное выражение для такой ситуации?

Переписал регулярное выражение вот в таком виде:

var lines = WScript.StdIn.ReadAll();

var re = /(Start: \S+ \S+)(?:(?:(?!(?:Start|Stop): \S+ \S+)[\S\s])+)USER=Admin(?:(?:(?!(?:Start|Stop): \S+ \S+)[\S\s])+)(Stop: \S+ \S+|)/g;

var r;
while ( r = re.exec(lines) ) {
    WScript.Echo(r[1] + '\t' + r[2]);
}

Насчёт опции поиска m не понял. Что с ним, что без него - результат одинаковый. Для чего он нужен?

И ещё почему, если записать так:

while ( r = /(Start: \S+ \S+)(?:(?:(?!(?:Start|Stop): \S+ \S+)[\S\s])+)USER=Admin(?:(?:(?!(?:Start|Stop): \S+ \S+)[\S\s])+)(Stop: \S+ \S+|)/g.exec(lines) ) {
    WScript.Echo(r[1] + '\t' + r[2]);
}

то скрипт зацикливается?

22

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

Насчёт опции поиска m не понял.

«Multiline».

…то скрипт зацикливается?

Наверное, потому, что находит одно и то же выражение каждый раз.

23

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

при использовании конструкций
while (/...../g.exec(){})
while ((new RegExp(".....","g")).exec(){})

свойство lastIndex обнуляется (сбрасывается) при каждом шаге цикла.

exec () метод

  • Если флаг g (global) не установлен для этого регулярного выражения, то поиск начинается с начала строки (с позиции индекса 0); при поиске игнорируется свойство lastIndex регулярного выражения.

  • Если флаг g (global) установлен для регулярного выражения, то поиск начинается с позиции индекса, указанной в свойстве lastIndex регулярного выражения. Если в результате поиска найдено совпадение подстроки, значение свойства lastIndex становится равным позиции конца совпадающей подстроки

.

24

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

badik

свойство lastIndex обнуляется (сбрасывается) при каждом шаге цикла

неточное толкование. Ниже Вы сами же и привели выдержки из описания метода. Свойство lastIndex при установленном флаге 'g' изменяется: устанавливается в позицию конца совпадающей подстроки, либо в 0, если совпадений не было.

( 2 * b ) || ! ( 2 * b )

25

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

И снова нужна помощь с регулярными выражениями. Задача следующая:
есть строки, содержащие набор натуральных чисел, разделённых запятой и пробелом

var stroka1 = "11, 12, 13, 14, 15, 17, 18, 19, 20"
var stroka2 = "11, 12, 13, 15, 18"
var stroka3 = "17, 19, 21, 25, 27"

и список чисел для поиска

var spisok = "14, 17, 19, 21, 25, 27"

Нужно выбрать строки, содержащие:
1) минимум 5 чисел;
2) содержащие хотя бы одно число из списка spisok
3) содержащие хотя бы одно число не из списка spisok

26 (изменено: Rumata, 2013-07-29 13:20:43)

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

Нужно выбрать строки, содержащие:
1) минимум 5 чисел;
2) содержащие хотя бы одно число из списка spisok
3) содержащие хотя бы одно число не из списка spisok

1) stroka.split( ', ' ).length >= 5
2) new RegExp( spisok.replace( /, /g, '|' ) ).test( stroka )
3) stroka.replace( new RegExp( '(' + spisok.replace( /, /g, '|' ) + ')(, |$)', 'g' ), '' ) != ''

( 2 * b ) || ! ( 2 * b )

27

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

Такой запрос в строке "123" найдёт число 23

28

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

Крепыш
Я не собираюсь решать всю задачу за Вас. Я показал примерное направление Ваших мыслей.

( 2 * b ) || ! ( 2 * b )

29

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

Сделал так:

var re = new RegExp('(?: |^)(?:' + spisok.replace(/, /g, '|') + ')(?:,|$)', 'g');
2) re.test(stroka);
3) var s = stroka.replace(re, '');

30

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

Попробуйте еще так:

new RegExp('\\b(?:' + spisok.replace(/, /g, '|') + ')(?:, |$)', 'g')
( 2 * b ) || ! ( 2 * b )

31 (изменено: Крепыш, 2013-07-30 12:10:35)

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

Rumata, спасибо!
В третьей задаче сам бы не додумался так сделать.

32

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

В третьей задаче лучше удалить все что соответствует и сравнивать с пустой строкой, чем строить отрицательное регулярное выражение, которое искало бы все что не соответствует.

( 2 * b ) || ! ( 2 * b )

33

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

Вот регулярка, детектирующая UTF-16 LE в hex дампе:

/^..(\w{4})*(0[04]((\w[^0])|([^0]\w))){3}/

в принципе, работает, но нельзя ли записать более красиво условие "любая комбинация из двух символов, кроме 00", а то ((\w[^0])|([^0]\w)) выглядит костылём.
(Без двух точек в начале будет детектировать BE)

34 (изменено: Rumata, 2013-11-20 08:28:20)

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

(?!00)\w\w

Тестировать надо

( 2 * b ) || ! ( 2 * b )

35 (изменено: Serge Yolkin, 2013-11-20 11:24:05)

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

Спасибо, работает. Самое смешное, что до (?!00) додумался, а победить незапоминание с помощью \w\w не догадался...

36 (изменено: Serge Yolkin, 2014-06-02 23:43:30)

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

Что-то меня заклинило:
есть некоторые строки

текст "'" текст "'" текст
текст '"' текст '"' текст
текст ' текст " текст " текст '
текст "текст" текст 'текст' текст

ну, и т.д.
Как отловить нечто в любых кавычках, игнорируя кавычки другого типа, оказавшиеся внутри первых? Кавычки на другую строку не переносятся, обработка построчная. Текст, разумеется, призвольный.

37

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

Вопрос:
Даны две строки. Любая из них может представлять собой отдельную фразу либо фразы, объединённые каким-то сепаратором, например, #. Задача - убрать из строки все совпадения.

' строка, в которой меняем и в ней же смотрим совпадения:
Str = "аааа#bbbb#cccc#dddd#eeee#ffff"
Sym = "#"  ' символ замены
With New RegExp
  .Pattern = "((^|#)(" & Replace(Str, "#", "|") & ")(#|$))|#{2,}"
  .IgnoreCase = True : .Global = True
  MsgBox .Replace(Str, Sym)
End With

На выходе получаем  #bbbb#dddd#ffff (чередование) вместо #. Как исправить?

38

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

Ничего не понятно.
Должно получится "а#b#c#d#e#f"?

Нас невозможно сбить с пути, нам пофигу куда идти.

39

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

Если "получаем ... вместо #", то что должно получиться?

40 (изменено: DnsIs, 2015-06-08 14:43:28)

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

Если вместо строки должно быть #, то простая регулярка:
replace(".*", "#")

А вообще, я так и не понял нифига.

Нас невозможно сбить с пути, нам пофигу куда идти.

41 (изменено: Flasher, 2015-06-08 15:48:46)

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

Для понимания достаточно прочесть внимательно задание и комментарии в коде.
Хотя, судя по ".*", в этом нет необходимости. ) Подождём спецов.

То, что аааа, bbbb - это фразы, разделённые решёткой понятно? Они могут быть какими угодно.
Суть не в том, что там окажется, а в том, как получить верный результат (даже, если исходная строка и проверочная совпадают, как в коде). Мне необходимо понять, почему мое выражение не является верным и на что надо обратить внимание.

42

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

Видимо такие люди пишут современные учебники. Вы не обижайтесь, просто действительно понять вас очень трудно. Мне и впрямь стало интересно, что скажут спецы. Вы же в курсе, что грамотно заданный вопрос содержит в себе половину ответа.
А регулярки составлять я люблю.

Нас невозможно сбить с пути, нам пофигу куда идти.

43

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

Ну, да. А мораль сей басни такова - мне ни фига не понятно, что именно Вам непонятно (это к учебникам).
В "ничего" как-то ну совсем не верится.

44

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

Сейчас придут Rumata с Serge Yolkin, разрулят все.

Нас невозможно сбить с пути, нам пофигу куда идти.

45

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

Скорее второго долго ждать придётся. Может, ещё JSMan, YMP. Xameleon с alexii давно не видно.

46 (изменено: DnsIs, 2015-06-08 16:49:15)

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

Ну а если серьезно.
Есть 2 строки:

аааа#bbbb#cccc#dddd#eeee#ffff
аааа#4444#dddd

Должно получится на выходе:

bbbb#cccc#eeee#ffff

Так?

Нас невозможно сбить с пути, нам пофигу куда идти.

47

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

Да. А если поменять местами, то на выходе - #4444.

48 (изменено: DnsIs, 2015-06-08 19:51:08)

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

Нифига не понимаю в VBS, но на JScript сделал бы так:

// строка, в которой меняем и в ней же смотрим совпадения:
string1 = "aaaa#bbbb#cccc#dddd#eeee#ffff"
string2 = "aaaa#4444#dddd"
sym = "#"
function rep (s1, s2) {
    p = s2.split(sym)
    for (i = 0; p.length > i; i++) {
        reg = new RegExp("#*"+p[i]);
        s1 = s1.replace(reg, "")
    }
    return (s1)
}
WScript.Echo(rep (string1, string2))
WScript.Echo(rep (string2, string1))

Вот ваш метод:

' строка, в которой меняем и в ней же смотрим совпадения:
Str = "аааа#bbbb#cccc#dddd#eeee#ffff"
Str2 = "аааа#4444#dddd"
Sym = "#"  ' символ замены
With New RegExp
  .Pattern = "((" & Replace(Str2, "#", "|") & ")(#|$))|#{2,}"
  .IgnoreCase = True : .Global = True
  MsgBox .Replace(Str, "")
End With
Нас невозможно сбить с пути, нам пофигу куда идти.

49 (изменено: Flasher, 2015-06-08 21:52:16)

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

DnsIs пишет:

Вот ваш метод:

Берём

Str = "аааа#bbbb"
Str2 = "bbbb#aaaa"

Результат: аааа#
Меняем местами, результат: bbbbaaaa

50 (изменено: Rumata, 2015-06-08 22:44:14)

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


var s = 'aaaa#bbbb#cccc#dddd#eeee#ffff';

var r = 'aaaa#4444#dddd';

var re = new RegExp('\\b(' + r.replace(/#/g, '|') + ')(#|$)', 'g');
var t = s.replace(re, '').replace(/#+$/, '');
( 2 * b ) || ! ( 2 * b )

51

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

Flasher пишет:

Берём

Str = "аааа#bbbb"
Str2 = "bbbb#aaaa"

Результат: аааа#
Меняем местами, результат: bbbbaaaa

А вы напишите все символы на одном языке.

Нас невозможно сбить с пути, нам пофигу куда идти.

52 (изменено: Flasher, 2015-06-09 05:14:58)

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

Rumata

var s = " aaaa#bbbb aaaa# aaaa"
var r = "aaaa#bbbb"

На выходе bbbb вместо bbbb aaaa# aaaa. И если поменять местами r и s, то вообще ничего не заменится.


DnsIs
Пардон. Хорошо. Другой вариант

Str = "aaaaa#bbbb#baaaa#cbbbbb#daaaa#eaaaa"
Str2 = "aaaa#bbbb"

вместо aaaaa#baaaa#cbbbbb#daaaa#eaaaa даёт abcbde.

53

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

А так:

' строка, в которой меняем и в ней же смотрим совпадения:
s1 = "aaaa#bbbb#aaaa#cbbbbb#daaaa#eaaaa"
s2 = "aaaa#bbbb"
sym = "#"  ' символ замены
s1 = sym & s1 & sym
With New RegExp
    .Pattern = sym & Replace(s2, sym, sym & "|" & sym) & sym
    .IgnoreCase = True : .Global = True
    s1 = .Replace(s1, sym)
    s1 = .Replace(s1, sym)
    .Pattern = "^" & sym & "|" & sym & "$"
    s1 = .Replace(s1, "")
    MsgBox s1
End With

Правда не красивый код.

Нас невозможно сбить с пути, нам пофигу куда идти.

54 (изменено: Flasher, 2015-06-09 09:12:05)

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

Как раз и хотелось бы избежать множественных вызовов .replace.
Если брать на вооружение подстановку делителя, то и тут попытка уместить в одно выражение провалилась:

Str = "aaaa#bbbb"
Str2 = "bbbb#aaaa"
Sym = "#"
With New RegExp
  .Pattern = "(" & Sym & "(" & Replace(Str2, Sym, "|") & ")" & Sym & ")|" & Sym & "{2,}"
  .IgnoreCase = True : .Global = True
   Result = .Replace(Sym & Str & Sym, "#")
End With : MsgBox Left(Result, Len(Result) - 1)

И в любом случае ситуация с ^ удручающая. Не работает ни с |, ни с ?.

55

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

Вам принципиально VBS?

Нас невозможно сбить с пути, нам пофигу куда идти.

56

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

Нужно именно для вставок в vbs, но код на js для сравнения, возможно, сгодится.

57 (изменено: Flasher, 2015-06-09 17:00:07)

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

Ну, вот, казалось бы, нашёл выход...

Str = "aaa# aaa#aaa# aaaa# bbb bbb#baaa#bbb#cbbbb#bbb#daaa"
Str2 = "bbb#aaa"
With New RegExp
  .Pattern = "(?=\x20*\b|#)(" & Replace(Str2, "#", "|") & ")(#|$)"
  .IgnoreCase = True : .Global = True
  Str = .Replace(Str, "") : .Pattern = "#$"
  MsgBox """" & .Replace(Str, "") & """"
End With

Да вот с кириллицей не работает. Почему?

Add: Выяснил. Это проблема именно комбинаций с решёткой.
Т.к. я её приводил лишь в качестве примера, меня это не особо пугает.
Спасибо участникам дискуссии.

58

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

Рано радовался насчёт решётки...

Str = "ййййЖЖффффЖЖфффф"
Str2 = "ффффЖЖййййЖЖфффф"
With New RegExp
  .Pattern = "(?= *\b|ЖЖ)(" & Replace(Str2, "ЖЖ", "|") & ")(ЖЖ|$)"
  .IgnoreCase = True : .Global = True
  Str = .Replace(Str, "") : .Pattern = "ЖЖ$"
  MsgBox .Replace("ЖЖ" & Str, "")
End With

Не работает...

59

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

С кириллицей есть давно известная проблема — её символы не считаются буквами. Поэтому и граница слова \b не работает, и словесный символ \w. Хотя игнорирование регистра вроде работает.

60

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

YMP
Спасибо за разъяснение. Весьма печальная новость. Это ж за столько лет и не исправить...
Придётся, видимо, либо так либо простым перебором в цикле. Эх...

61

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

DnsIs, с Вашим кодом тоже не всё в порядке. Попробуйте:

s1 = "bbbb#фффф#cccc#ffff#dddd#tttt#яяяя#eeee#ffff"
's1 = "bbbb#фффф#cccc#ffff#dddd#eeee#ffff"
s2 = s1

62

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

YMP пишет:

С кириллицей есть давно известная проблема — её символы не считаются буквами.

В формате PCRE эта проблема обходится. На AHK:

RegExMatch("Roman_Кириллица", "(*UCP)\w+", match)
MsgBox, % match
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

63

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

Ясно, помимо AHK ещё ряд языков дружат с PCRE. Но тут - увы и ах...