Сделать регулярное выражение не жадным? [dубликат]

Вы не можете сериализовать static классы (или любой класс вообще) с использованием встроенных функций сериализации .NET. Вы можете сериализовать экземпляры классов.

65
задан Brad Mace 9 July 2011 в 08:31
поделиться

8 ответов

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

  ^ stop  

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

  ^ stop \ W  
6
ответ дан Alex B 15 August 2018 в 18:56
поделиться

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

  ^ stop  

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

  ^ stop \ s  

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

  ^ stop \ W  

С другой стороны, то, что следует, соответствует слову в начале (в этих ароматах \ w совпадает с \ W)

  ^ \ w  

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

  ^ [a-zA-Z0-9] +  

Будьте осторожны, что эта вторая идиома будет соответствовать только буквам и номерами, никакими символами.

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

133
ответ дан DeveloperDan 15 August 2018 в 18:56
поделиться
  • 1
    +1 для обобщения вашего ответа. Мне бы хотелось увидеть больше об этом в Stack Overflow. По моему мнению, это лучший учебный ресурс. – Jim 6 August 2009 в 19:26
  • 2
    Как сделать регистр неприемлемым, т. Е. Совпадение Стоп или остановка или sTop? – Elton Garcia de Santana 19 June 2018 в 19:45
  • 3
    Зависит от вашего языка ... Perl-совместимый может использовать модификатор I. / regex / i .NET RegexOptions.IgnoreCase и т. д. – Vinko Vrsalovic 19 June 2018 в 19:49

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

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

0
ответ дан Manisha Chaurasia 15 August 2018 в 18:56
поделиться
  • 1
    Не могли бы вы просто использовать & quot; ^ stop & quot; ? – Stephen Rauch 4 December 2017 в 02:58
  • 2
    Это зависит. Говоря в терминах синтаксиса java, мы можем использовать объект Pattern и Matcher для использования регулярного выражения или прямого использования метода .matches () с объектом String. Они отличаются результатом: code Строка строка = «остановлена»; r = Pattern.compile (pattern); Matcher m = r.matcher (строка); System.out.println (m.find ()); // выводит true System.out.println (line.matches (pattern)); // выводит false – Manisha Chaurasia 4 December 2017 в 06:58
  • 3
    Это соответствует только если слово в начале строки. Если слова, начинающиеся с «stop», находятся в середине строки или в конце, это регулярное выражение не будет совпадать. @StephenRauch, если вы опустите [a-z] *, вы не получите никаких слов типа «stopping» & quot; в целом. В случае "остановки" вы получаете "stop & quot; и "ping" будет отсутствовать. – Sedat Kilinc 10 December 2017 в 21:48
  / stop ([a-zA-Z]) + /  

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

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

  / ^ stop /  

, выполните: D

6
ответ дан Mez 15 August 2018 в 18:56
поделиться
  • 1
    Это будет соответствовать «не прекращать движение». – Alex B 6 August 2009 в 19:08
  • 2
    Я перечитал вопрос и изменил свой ответ: D – Mez 6 August 2009 в 19:09
  • 3
    Это не будет соответствовать stop123 или stop. – Sharad Holani 6 November 2017 в 05:51

Попробуйте следующее:

  / ^ stop. * $ /  

Объяснение:

  • / charachters ограничивают регулярное выражение (т. е. они не являются частью Regex per se)
  • ^ означает совпадение в начале строки
  • . (*)
  • $ означает конец строки

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

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

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

52
ответ дан Mike Dinescu 15 August 2018 в 18:56
поделиться
  • 1
    . * $ избыточно. – Mez 6 August 2009 в 19:11
  • 2
    Не все языки используют forwardslhes для разграничения регулярных выражений. – JAB 6 August 2009 в 19:34
  • 3
    @Cat Megex: Именно поэтому я добавил объяснение. Если ваш язык использует что-то еще, чтобы разграничить регулярное выражение, замените / соответствующим символом – Mike Dinescu 6 August 2009 в 19:37
  • 4
    @Mez да, и такая избыточность увеличивает как ясность, так и производительность rexegg.com/regex-optimizations.html#anchors – MarredCheese 7 February 2018 в 21:41

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

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

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

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

0
ответ дан Robert Elwell 15 August 2018 в 18:56
поделиться

Как @SharadHolani сказал. Это не будет соответствовать каждому слову, начинающемуся с «stop»

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

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

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

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

stop (1)

stop random (2)

stopping (3)

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

остановитесь (5)

Но

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

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

11
ответ дан Sedat Kilinc 15 August 2018 в 18:56
поделиться
15
ответ дан Waxo 15 August 2018 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: