Декодировать строку регулярного выражения, которая соответствует слову в строке - PullRequest
1 голос
/ 25 декабря 2009

У меня есть следующее регулярное выражение

var value = "hello";
"(?<start>.*?\W*?)(?<term>" + Regex.Escape(value) + @")(?<end>\W.*?)"

Я пытаюсь выяснить значение, потому что оно не работает против одного слова. например, оно соответствует «они сказали« привет »», но просто «привет»

Не могли бы вы помочь мне расшифровать, что означает эта строка регулярного выражения?!

PS: это регулярное выражение .NET

Ответы [ 3 ]

3 голосов
/ 25 декабря 2009

Это из-за \W в последней части. \W не A-Z0-9_ char.

В "они сказали привет" есть место после привет, но "привет" там ничего нет, вот почему.

Если вы измените его на (?<end>\W*.*?), это может сработать.

На самом деле само по себе регулярное выражение не имеет смысла, скорее, оно должно выглядеть так:

"\b" + Regex.Escape(value) + "\b"

\b является границей слова

1 голос
/ 25 декабря 2009

Регулярное выражение может пытаться найти шаблон, содержащий целые слова, так что ваш пример hello не соответствует, скажем, Othello. Если это так, регулярное выражение границы слова \b специально предназначено для этой цели:

@"\b(" + Regex.Escape(value) + @")\b"
0 голосов
/ 25 декабря 2009

, если это регулярное выражение .NET, а часть Regex.escape () заменяется просто 'hello' .. Regex Buddy говорит, что это означает:

(?<start>.*?\W*?)(?<term>hello)(?<end>\W.*?)

Options: case insensitive

Match the regular expression below and capture its match into backreference with name “start” «(?<start>.*?\W*?)»
   Match any single character that is not a line break character «.*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
   Match a single character that is a “non-word character” «\W*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the regular expression below and capture its match into backreference with name “term” «(?<term>hello)»
   Match the characters “hello” literally «hello»
Match the regular expression below and capture its match into backreference with name “end” «(?<end>\W.*?)»
   Match a single character that is a “non-word character” «\W»
   Match any single character that is not a line break character «.*?»
      Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...