Регулярное выражение Javascript - PullRequest
2 голосов
/ 23 февраля 2009

Я пытался сделать регулярное выражение для кого-то еще, когда столкнулся с этой проблемой. Требованием было то, что регулярное выражение должно возвращать результаты из набора строк, в котором есть, скажем, «яблоко». Например, рассмотрим следующие строки:

"I have an apple" "You have two Apples" "I give you one more orange"

Результирующий набор должен иметь первые две строки.

Регулярное выражение (я), которые я пробовал:

/[aA]pple/ и /[^a-zA-Z0-9][aA]pple/

Проблема с первым из них заключается в том, что такие слова, как «aapple», «bapple» и т. Д. (Хорошо, они бессмысленны, но все же ...), имеют положительный результат, а проблема со вторым заключается в когда строка на самом деле начинается со слова «яблоко», «яблоки и апельсины», например, она дает отрицательный результат. Может кто-нибудь объяснить, почему второе регулярное выражение ведет себя так и каким будет правильное регулярное выражение?

Ответы [ 5 ]

8 голосов
/ 23 февраля 2009
/(^.*?\bapples?\b.*$)/i

Редактировать: выше будет соответствовать всей строке, содержащей слово "яблоки", что я думал, что вы просили. Если вы просто пытаетесь увидеть, содержит ли строка слово, сработает следующее.

/\bapples?\b/i

Регулярное выражение (я), которые я пробовал:

/[aA]pple/ and /[^a-zA-Z0-9][aA]pple/

Первый просто проверяет наличие следующих символов по порядку: apple, независимо от того, в каком контексте они используются. \ B, или символ границы слова, соответствует любому месту, где не является символом слова и слово встречается, аля \W\w.

Второй пытается сопоставить другие символы перед появлением a-p-p-l-e и по существу такой же, как и первый, за исключением того, что требует других символов перед ним.

Тот, на который я ответил, работает следующим образом. С начала строки сопоставляет любые символы (если они существуют) без жадности, пока не встретит границу слова. Если строка начинается с apple, начало строки является границей слова, поэтому оно все равно совпадает. Затем он соответствует буквам a-p-p-l-e и s, если они существуют, за которыми следует граница другого слова. Затем он сопоставляет все символы до конца строки. Знак / i в конце означает, что он не чувствителен к регистру, поэтому допустимы «Apple», «APPLE» и «apple».

Если у вас есть время, я настоятельно рекомендую пройтись по учебнику по http://regular -expressions.info . Это действительно всесторонне рассказывает о том, как механизмы регулярных выражений соответствуют различным выражениям, это мне очень помогло.

3 голосов
/ 23 февраля 2009

Для построения на @ tj111 причина вашего второго регулярного выражения в том, что [^a-zA-Z0-9] требует, чтобы символ совпадал; то есть в этой позиции есть какой-то символ, и его значение не содержится в наборе [a-zA-Z0-9]. Маркеры типа \b называются «утверждениями нулевой ширины». \b, в частности, соответствует границам между символами или в начале или конце строки. Поскольку он не соответствует ни одному символу, его "ширина" равна нулю.

В сумме [^a-zA-Z0-9] требует наличия символа, который не принимает определенного значения, в то время как \b требует только наличия границы.

Редактировать: @ tj111 добавил большую часть этого в свой ответ. Я опоздал, опять же:)

1 голос
/ 23 февраля 2009

Это работает для apple и apples и его регистронезависимых написаний:

var strings = ["I have an apple", "You have two Apples", "I give you one more orange"];
var result = [];
var pattern = /\bapples?\b/i;
for (var i=0; i<strings.length; i++) {
    if (pattern.test(strings[i])) {
        result.push(strings[i]);
    }
}
0 голосов
/ 23 февраля 2009

Вашему второму регулярному выражению требуется не буквенно-цифровой символ перед первым знаком a в apple. «яблоко» не удовлетворяет это. Как отмечают другие, «\ b» соответствует не символу, а границе слова.

0 голосов
/ 23 февраля 2009
/\bapple/i

\ b - это граница слова .

Чтобы объяснить, почему ваши попытки не работают, первая не проверяет, что это начало слова, поэтому перед ним может что-то стоять. Второе регулярное выражение, которое вы дали, говорит, что что-то должно быть перед словом «яблоко», но оно не может быть буквенно-цифровым.

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