Регулярное выражение для соответствия строке, начинающейся с «стоп»

99

Как создать регулярное выражение, соответствующее слову в начале строки. Мы ищем соответствие stopв начале строки, и все может следовать за ним.

Например, выражение должно соответствовать:

stop
stop random
stopping

Спасибо.

Брэд Мейс
источник

Ответы:

187

Если вы хотите сопоставить только строки, начинающиеся с остановки, используйте

^stop

Если вы хотите сопоставить строки, начинающиеся со слова stop, за которым следует пробел

^stop\s

Или, если вы хотите сопоставить строки, начинающиеся со слова stop, но за которым следует либо пробел, либо любой другой символ, не являющийся словом, который вы можете использовать (ваш вариант регулярного выражения позволяет)

^stop\W

С другой стороны, то, что следует далее, соответствует слову в начале строки в большинстве разновидностей регулярных выражений (в этих разновидностях \ w соответствует противоположности \ W)

^\w

Если в вашем вкусе нет ярлыка \ w, вы можете использовать

^[a-zA-Z0-9]+

Будьте осторожны, эта вторая идиома будет соответствовать только буквам и цифрам, без каких-либо символов.

Ознакомьтесь с руководством по использованию регулярных выражений, чтобы узнать, какие сочетания клавиш разрешены и что именно они соответствуют (и как они работают с Unicode).

Винко Врсалович
источник
27
+1 за обобщение вашего ответа. Я хотел бы увидеть больше этого на Stack Overflow. На мой взгляд, делает его лучшим учебным ресурсом.
Джим
Как сделать его нечувствительным к регистру, т.е. соответствовать Stop или stop или sTop?
Элтон Гарсиа де Сантана
Зависит от вашего языка ... Perl-совместимый может использовать модификатор I. / regex / i .NET RegexOptions.IgnoreCase и так далее
Винко Врсалович
Не забывайте ^stop\b, что допускаются любые границы, включая конец строки
Безумный физик,
80

Попробуй это:

/^stop.*$/

Пояснение:

  • / символы ограничивают регулярное выражение (т.е. они не являются частью регулярного выражения как такового)
  • ^ Означает соответствие в начале строки
  • . за которым следует * означает соответствие любому символу (.) любое количество раз (*)
  • $ означает до конца строки

Если вы хотите, чтобы эта остановка сопровождалась пробелом, вы можете изменить RegEx следующим образом:

/^stop\s+.*$/
  • \ s означает любой пробельный символ
  • + после \ s означает, что после стоп-слова должен быть хотя бы один пробельный символ

Примечание. Также имейте в виду, что приведенное выше регулярное выражение требует, чтобы после стоп-слова был пробел! Таким образом, он не будет соответствовать строке, содержащей только: stop

Майк Динеску
источник
Не все языки используют косую черту для разделения регулярных выражений.
JAB
1
@Cat Megex: Именно поэтому я добавил объяснение. Если в вашем языке для разделения регулярных выражений используется что-то еще, замените / на правильный символ
Майк Динеску,
1
@Mez да, и такая избыточность увеличивает как ясность, так и производительность rexegg.com/regex-optimizations.html#anchors
MarredCheese 07
30

Если вы хотите сопоставить что-либо после остановки слова, а не только в начале строки, вы можете использовать: \bstop.*\b- слово, за которым следует строка

Слово до конца строки

Или, если вы хотите сопоставить слово в строке, используйте \bstop[a-zA-Z]*- только слова, начинающиеся с остановки

Только слова, начинающиеся с стоп

Или начало строки с остановкой только ^stop[a-zA-Z]*для слова - только первое слово
Вся строка ^stop.*- только первая строка строки

И если вы хотите сопоставить каждую строку, начинающуюся с остановки, включая символы новой строки, используйте: /^stop.*/s- многострочную строку, начинающуюся с остановки

Waxo
источник
20

Как сказал @SharadHolani. Это не соответствует каждому слову, начинающемуся с " стоп "

. Только если он стоит в начале строки типа « хватит ». @Waxo дал правильный ответ:

Это один немного лучше, если вы хотите , чтобы соответствовать любому слову , начинающемуся с « стоп » и не содержащим ничего , кроме письма от А до Z .

\bstop[a-zA-Z]*\b

Это будет соответствовать всем

стоп (1)

остановить случайный (2)

остановка (3)

хочу остановиться (4)

пожалуйста, остановись (5)

Но

/^stop[a-zA-Z]*/

будет соответствовать только (1) до (3), но не (4) и (5)

Седат Килинч
источник
8
/stop([a-zA-Z])+/

Соответствует любому стоп-слову (остановка, остановка, остановка и т. Д.)

Однако, если вы просто хотите сопоставить «стоп» в начале строки

/^stop/

сделаю: D

Мез
источник
2
Это будет соответствовать "не прекращай идти"
Alex B
1
Это не будет соответствовать stop123 или stop ,.
lostintranslation 06
7

Если вы хотите сопоставить все, что начинается с «стоп», включая «стоп», «стоп» и «стоп», используйте:

^stop

Если вы хотите сопоставить слово « стоп», за которым следует что-нибудь, например «прекратить», «остановить это», но не «остановил» и не «остановить», используйте:

^stop\W
Алекс Б
источник
0

Я бы не советовал использовать простые регулярные выражения для решения этой проблемы. Слишком много слов являются подстроками других не связанных между собой слов, и вы, вероятно, сведете себя с ума, пытаясь перенастроить уже предоставленные более простые решения.

Вам понадобится хотя бы наивный алгоритм стемминга (попробуйте стеммер Porter; для большинства языков доступен бесплатный код), чтобы сначала обработать текст. Храните этот обработанный текст и предварительно обработанный текст в двух отдельных массивах, разделенных пробелами. Убедитесь, что каждый небуквенный символ также имеет свой индекс в этом массиве. Какой бы список слов вы ни фильтровали, ограничьте и их.

Следующим шагом будет поиск индексов массива, которые соответствуют вашему списку «стоповых» слов с корнем. Удалите их из необработанного массива, а затем снова присоединитесь к пробелам.

Это немного сложнее, но будет гораздо более надежным подходом. Если у вас есть какие-либо сомнения в ценности подхода, более ориентированного на НЛП, возможно, вы захотите провести небольшое исследование клбуттических ошибок .

Роберт Элвелл
источник
0

Если вы хотите, чтобы слово начиналось с «стоп», вы можете использовать следующий шаблон. "^ стоп. *"

Это будет соответствовать словам, начинающимся с остановки, за которой следует что-либо.

Маниша Чауразия
источник
1
Не могли бы вы просто использовать "^stop"?
Стивен Раух
Это зависит. Говоря о синтаксисе Java, мы можем использовать объект Pattern и Matcher для использования регулярного выражения или прямого использования метода .matches () с объектом String. Они различаются по результату, как code String line = "stopped"; String pattern = "^stop"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); System.out.println(m.find( )); //prints true System.out.println(line.matches(pattern)); //prints false
Manisha Chaurasia
1
Это соответствует, только если слово в начале строки. Если слова, начинающиеся с «стоп», находятся в середине или в конце строки, это регулярное выражение не будет соответствовать. @StephenRauch, если вы опустите [az] *, вы не получите слов вроде «остановка» целиком. В случае «остановки» вы получите «стоп», а «пинг» будет отсутствовать.
Седата Kilinc