Регулярное выражение AS3 для сопоставления слов с символами типа boundry в них
-
16-09-2019 - |
Вопрос
Я хочу составить список слов, что достаточно просто, когда эти слова действительно являются словами.Например /\b (pop|push) \b/gsx
когда натыкался на струну
папа толкнул дверь, но она распахнулась сама
будет соответствовать словам pop и push, но не popped.
Мне нужна аналогичная функциональность для слов, содержащих символы, которые обычно квалифицируются как границы слов.Поэтому мне нужно /\b (reverse!|push) \b/gsx
когда натыкался на струну
нажимай задний ход!задний ход!толкай
соответствовать только обратному!и нажимайте, но не совпадайте с обратным! нажимайте.Очевидно, что это регулярное выражение не собирается этого делать, так что же мне нужно использовать вместо \ b, чтобы сделать мое регулярное выражение достаточно умным, чтобы справиться с этими причудливыми требованиями?
Решение
В конце слова \b означает "предыдущий символ был символом word, а следующий символ (если есть следующий символ) не является символом word.Вы хотите исключить первое условие, потому что в конце "слова" может быть символ, не являющийся словом.Это оставляет вас с негативным взглядом:
/\b (reverse!|push) (?!\w)/gx
Я почти уверен, что регулярные выражения AS3 поддерживают предварительный просмотр.
Другие советы
Ваша первая проблема заключается в том, что вам нужно три (возможно, четыре) случая в вашем чередовании, а не два.
/\breverse!(?:\s|$)/
наоборот!сам по себе/\bpush\b/
толчок сам по себе/\breverse!push\b/
вместе/\bpushreverse!(?:\s|$)/
это возможный случай
Ваша вторая проблема заключается в том, что \b
не будет совпадать после "!"
потому что это не \w
.Вот что Perl 5 должен сказать о \b
, возможно, вы захотите проконсультироваться со своими документами, чтобы узнать, согласны ли они:
Граница слова ("\b") - это точка между двумя символами, на одной стороне которой есть "\w", а на другой - "\W" (в любом порядке), считая воображаемые символы от начала и конца строки как соответствующие "\W".(В символьных классах "\b" представляет пробел, а не границу слова, как это обычно делается в любой строке, заключенной в двойные кавычки.)
Итак, регулярное выражение, которое вам нужно, это что-то вроде
/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;
Я упустил из виду /s
поскольку в этом регулярном выражении нет точек, поэтому рассматривать его как одну строку не имеет смысла.Если /s
это не означает, что вы должны рассматривать это как отдельную строку в вашем движке, вам, вероятно, следует добавить ее обратно.Кроме того, вам следует прочитать о том, как ваш двигатель справляется с чередованием.Я знаю, что в Perl 5, чтобы получить правильное поведение, вы должны расположить элементы таким образом (в противном случае наоборот!всегда побеждал бы обратный! толчок).
Вы можете заменить \b чем-то эквивалентным, но менее строгим:
/(?<=\s|^)(reverse!|push)(?=\s|$)/g
Таким образом, ограничивающий фактор \b
(что он может совпадать только до или после фактического \w
символ слова) удаляется.
Теперь пробелы или начало / конец строки функционируют как допустимые разделители, а внутреннее выражение может быть легко создано во время выполнения, например, из списка поисковых запросов.