#javascript
#javascript
Вопрос:
У меня есть RegExp
:
/.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?/gi
и немного текста "Champion"
каким-то образом это возвращается как совпадение, я сумасшедший?
0: "pio"
1: "i"
index: 4
input: "Champion"
length: 2
цикл здесь:
// contruct the pattern, dynamically
var someText = "Champion";
var phrase = ".?(NCAA|Division|I|Basketball|Champions,|1939-2011).?";
var pat = new RegExp(phrase, "gi"); // <- ends up being
var resu<
while( result = pat.exec(someText) ) {
// do stuff!
}
Должно быть что-то не так с моим регулярным выражением, верно?
РЕДАКТИРОВАТЬ: .?
Это была просто быстрая и грязная попытка сказать, что я хотел бы сопоставить одно из этих слов И / ИЛИ одно из этих слов с одним символом с обеих сторон. например:
sNCAAs
NCAA
NCAAs
sNCAA
ЦЕЛЬ:
Я пытаюсь выполнить простое выделение совпадений на основе некоторых поисковых слов. У меня есть функция, которая получает все текстовые узлы на странице, и я хотел бы просмотреть их все и выделить любые соответствия любому из терминов в моей phrase
переменной.
Я думаю, что мне просто нужно переработать то, как я создаю свое регулярное выражение.
Комментарии:
1. Является
pat
объектом RexExp или строкой? В вашем коде это строка.2. @Matt На самом деле это регулярное выражение, позвольте мне исправить код… Я думал, что это работает в обоих направлениях, нет?
3. Вы никогда на самом деле не указывали, что вы ХОТИТЕ, чтобы произошло или что вы ОЖИДАЕТЕ, что это произойдет здесь. Теперь это не так очевидно.
4. Зависит от того, что вы подразумеваете под «это работает в обоих направлениях». Было бы полезно, если бы вы могли объяснить немного больше о конечной цели, которую вы пытаетесь достичь, потому что это могло бы быть что-то лучше сделать с
String.split()
.5. позвольте мне дополнить вопрос тем, чего я пытаюсь достичь.
Ответ №1:
Ну, во-первых, вы указываете нечувствительность к регистру, а во-вторых, вы сопоставляете букву I
как одну из вашей подходящей строки.
Champion
будет соответствовать pio
и i
, потому что они оба совпадают /.?I.?/gi
Однако оно не соответствует /.?Champions,.?/gi
из-за запятой в конце.
Ответ №2:
Добавьте привязки start ( ^
) и end ( $
) к регулярному выражению.
/^.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?$/gi
Без якорей совпадение регулярных выражений может начинаться и заканчиваться в любом месте строки, вот почему
/.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?/gi.exec('Champion')
может совпадать с pio
и i
: потому что это фактически совпадает с (без учета регистра) I
. Если вы оставите якоря выключенными, но удалите ...|I|...
, регулярное выражение не будет соответствовать 'Champion'
:
> /.?(NCAA|Division|Basketball|Champions,|1939-2011).?/gi.exec('Champion')
null
Ответ №3:
Champion
Матчи /.?I.?/i
.
В вашем собственном выводе отмечается, что оно соответствует подстроке «pio».
Возможно, вы имели в виду привязать выражение к началу и концу входных данных с помощью ^
и $
соответственно:
/^.?(NCAA|Division|I|Basketball|Champions,|1939-2011).?$/gi
Я знаю, вы сказали игнорировать .?
, но я не могу: это, скорее всего, неправильно, и, скорее всего, это продолжит вызывать у вас проблемы. Объясните, почему они там, и мы можем рассказать вам, как это сделать правильно. 🙂
Комментарии:
1. @samandmoore: Вы даже не упомянули
.?
в своем обновлении, давайте вместе объясним их использование.2. эта информация обновлена, я не сохранил ее сразу, виноват.
3. @samandmoore: Если вы пытаетесь разрешить пробелы с обеих сторон, предпочтите предварительно удалить этот пробел из входной строки.
4. @Tomalak Это точно не сработает, потому что я хотел бы найти совпадения, не изменяя входную строку. Цель состоит в том, что я пытаюсь взять некоторый текст и выделить в нем совпадение. Я хотел бы разрешить ему быть снисходительным на один символ с каждой стороны, даже если это приведет к ложному срабатыванию.
5. @samandmoore: Тогда, согласно этой логике, соответствие «чемпиону» полностью разумно в соответствии с вашим вариантом использования.