Регулярное выражение не соответствует тому, что я ожидал - PullRequest
0 голосов
/ 26 августа 2009

Рассмотрим следующую операцию сопоставления регулярных выражений Javascript:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(^|\s)mso.*?(\s|$)/ig);

Я ожидаю, что он вернется [" MsoClass2\t", "\tmsoclass3\t", " MSOclass4 ", " msoc5"]. Вместо этого он возвращает [" MsoClass2\t", " MSOclass4 "].

Почему?

Ответы [ 5 ]

2 голосов
/ 26 августа 2009

Поскольку первое совпадение использует символ табуляции, поэтому перед второй строкой MSO не остается символа пробела. То же самое с пробелом после второго матча.

Возможно, вы хотите сопоставить границы слов вместо разделяющих символов. Этот код:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\bmso.*?\b/ig)

даст вам такой результат:

["MsoClass2","msoclass3","MSOclass4","msoc5"]
2 голосов
/ 26 августа 2009

Символ табуляции перед msoclass3 уже используется первым совпадением " MsoClass2\t". Возможно, вы хотите вместо этого использовать непотребляющее упреждающее утверждение:

/(^|\s)mso[^\s]*(?=\s|$)/
0 голосов
/ 26 августа 2009

Это потому, что вы используете ^ OR \ s (пробел) для первого совпадения, в то время как строка не имеет пробелов для класса 3. Чтобы получить желаемые результаты, используйте следующую функцию match ():

/mso.*?(\s|$)/ig
0 голосов
/ 26 августа 2009

Я не уверен, что вы можете использовать что-то вроде (^|\s) и (\s|$), во-первых - может быть, вы можете, но мне нужно поблагодарить, чтобы понять регулярное выражение - и это никогда не бывает хорошо, когда кто-то должен думать, чтобы понять регулярное выражение: это часто слишком сложно: - (


Если вы хотите сопоставить слова, начинающиеся с «mso», будь то прописные или строчные буквы, я бы, вероятно, использовал что-то вроде этого:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\s?(mso[^\s]*)\s?/ig);

Что тебя достает:

[" MsoClass2 ", "msoclass3 ", " MSOclass4 ", "msoc5"]

Что (почти: есть пара отличий между пробелами), что вы спросили.

Или еще проще:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(mso[^\s]*)/ig);

Что тебя достает:

["MsoClass2", "msoclass3", "MSOclass4", "msoc5"]

Без пропусков.


Также легче читать / понимать; -)

0 голосов
/ 26 августа 2009

Поскольку после совпадения " MsoClass2\t" средство сопоставления смотрит на m в msoclass3, что не соответствует начальному пространству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...