Регулярний вираз для узгодження рядка, що починається зі “стоп”


97

Як створити регулярний вираз, який відповідає слову на початку рядка. Ми прагнемо збігатися stopна початку рядка, і будь-що може слідувати за ним.

Наприклад, вираз повинен відповідати:

stop
stop random
stopping

Дякую.

Відповіді:


184

Якщо ви хочете відповідати лише рядкам, що починаються з припинення використання

^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.*$/

Пояснення:

  • / charachters обмежують регулярний вираз (тобто вони не є частиною регулярного виразу як такі)
  • ^ означає збіг на початку рядка
  • . після чого * означає відповідність будь-якому символу (.), будь-яку кількість разів (*)
  • $ означає кінець рядка

Якщо ви хочете примусити цю зупинку супроводжуватися пробілами, ви можете змінити RegEx так:

/^stop\s+.*$/
  • \ s означає будь-який пробіл
  • + після \ s означає, що після стоп-слова повинен бути принаймні один пробіл

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


Не всі мови використовують косий знак уперед для обмеження регулярних виразів.
JAB

1
@Cat Megex: Саме тому я додав пояснення. Якщо ваша мова використовує щось інше для обмеження регулярного виразу, замініть / належним символом
Mike Dinescu

1
@Mez так, і така надмірність збільшує як чіткість, так і продуктивність rexegg.com/regex-optimizations.html#anchors
MarredCheese

28

Якщо ви хочете, щоб щось збігалося після зупинки слова, ви можете використовувати не лише на початку рядка: \bstop.*\b- слово, за яким слідує рядок

Слово до кінця рядка

Або , якщо ви хочете , щоб відповідати слову у використанні рядка \bstop[a-zA-Z]*- лише слова , що починаються з обмежувачем

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

Або початок рядків із зупинкою лише ^stop[a-zA-Z]*для слова - лише перше слово
Весь рядок ^stop.*- перший рядок рядка

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


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
Це буде відповідати "не переставати йти"
Алекс Б

1
Це не буде відповідати stop123 або stop ,.
загублений переклад

7

Якщо ви хочете порівняти будь-що, що починається зі "стоп", включаючи "зупинити рух", "зупинка" та "зупинка", використовуйте:

^stop

Якщо ви хочете, щоб слово " стоп" супроводжувалось будь-чим, як у "зупинити рух", "зупиніть це", але не "зупинено" та не "зупинено" використовуйте:

^stop\W

0

Я б порадив не застосовувати простий регулярний вираз до цієї проблеми. Занадто багато слів, які є підрядками інших не пов’язаних між собою слів, і ви, мабуть, зведете себе з розуму, намагаючись переадаптувати простіші рішення, що вже пропонуються.

Ви хочете, щоб принаймні наївний алгоритм стермінування (спробуйте штамм Портера; доступний безкоштовний код на більшості мов) спочатку обробляє текст. Зберігайте цей оброблений текст та попередньо оброблений текст у двох окремих масивах, розділених пробілом. Переконайтесь, що кожен не алфавітний символ також отримує свій власний індекс у цьому масиві. Незалежно від списку слів, який ви фільтруєте, потримайте їх.

Наступним кроком буде пошук індексів масиву, які відповідають вашому списку сформованих слів зупинки. Видаліть їх з необробленого масиву, а потім знову приєднайтеся до пробілів.

Це лише трохи складніше, але підхід буде набагато надійнішим. Якщо у вас є якісь сумніви у значенні більш орієнтованого на НЛП підходу, можливо, ви захочете провести кілька досліджень щодо критичних помилок .


0

Якщо ви хочете, щоб слово починалося зі "стоп", ви можете використати такий шаблон. "^ зупинити. *"

Це буде відповідати словам, що починаються з зупинки, після чого щось.


1
Чи не могли б ви просто використовувати "^stop"?
Stephen Rauch

Це залежить. Розмовляючи з точки зору синтаксису 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
показано

1
Це збігається лише в тому випадку, якщо слово на початку рядка. Якщо слова, що починаються на "стоп", знаходяться посередині рядка або в кінці, цей регулярний вираз не збігатиметься. @StephenRauch, якщо ви пропустите [az] *, ви не отримаєте таких слів, як "зупинка". У випадку "зупинки" ви отримуєте "стоп" і "пінг" буде відсутній.
Sedat Kilinc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.