Регулярное выражение AS3 для сопоставления слов с символами типа boundry в них

StackOverflow https://stackoverflow.com/questions/790202

Вопрос

Я хочу составить список слов, что достаточно просто, когда эти слова действительно являются словами.Например /\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 символ слова) удаляется.

Теперь пробелы или начало / конец строки функционируют как допустимые разделители, а внутреннее выражение может быть легко создано во время выполнения, например, из списка поисковых запросов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top