AS3 RegExp для сопоставления слов с символами ограниченного типа в них - PullRequest
1 голос
/ 26 апреля 2009

Я хочу сопоставить список слов, что достаточно просто, когда эти слова действительно слова. Например /\b (pop|push) \b/gsx при запуске против строки

Попа толкнула дверь, но она отскочила назад

будет соответствовать словам pop и push, но не выскочить.

Мне нужна аналогичная функциональность для слов, которые содержат символы, которые обычно квалифицируются как границы слов. Так что мне нужно /\b (reverse!|push) \b/gsx при запуске против строки

толчок назад! обратный! толкать

только для совпадения! и нажмите, но не соответствует обратному! нажмите. Очевидно, что это регулярное выражение не собирается делать это, так что мне нужно использовать вместо \ b, чтобы сделать мое регулярное выражение достаточно умным, чтобы справиться с этими странными требованиями?

Ответы [ 3 ]

2 голосов
/ 26 апреля 2009

В конце слова \ b означает «предыдущий символ был символом слова, а следующий символ (если есть следующий символ) не является символом слова. Вы хотите удалить первое условие, потому что быть не состоящим из слов словом в конце слова. Это оставляет вас с негативным взглядом:

/\b (reverse!|push) (?!\w)/gx

Я почти уверен, что регулярные выражения AS3 поддерживают прогноз.

0 голосов
/ 26 апреля 2009

Вы можете заменить \ b чем-то эквивалентным, но менее строгим:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

Таким образом, ограничивающий фактор \b (который может совпадать только до или после фактического символа \w слова) удаляется.

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

0 голосов
/ 26 апреля 2009

Ваша первая проблема заключается в том, что вам нужно три (возможно, четыре) случая в вашем чередовании, а не два.

  • /\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, чтобы получить правильное поведение, вы должны расположить предметы таким образом (в противном случае задний ход! Всегда побеждает задний ход! Толчок).

...