Как сопоставить слова, которые не начинаются и не заканчиваются определенными символами, используя Regex? - PullRequest
0 голосов
/ 09 октября 2019

Я хочу найти совпадения слов, которые не начинаются и не заканчиваются какими-то конкретными символами.

Например, у меня есть этот ввод, и я хочу соответствовать только выделенному слову:

"строка" строка 'строка'

И исключить другие слова, которые начинаются и заканчиваются либо ", либо '.

В настоящее время я использую этот шаблон:

enter image description here

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

Может кто-нибудь дать мне какой-нибудь советпо какой схеме я должен использовать? Спасибо

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Шаблон, который вы используете в данный момент, соответствует, так как \b правильно устанавливает позиции между "s и g" (позиция между символом слова [a-zA-Z0-9_] и несловесным символом). Вы можете использовать один из следующих методов:

  1. Отрицание определенных символов (отрицательный вид сзади / lookahead)
    • Этот метод позволяет указать символ, набор символов или подстроку для отрицанияиз матча.
    • (?<!['"])\bstring\b(?!['"]) - увидеть его здесь
      • (?<!['"]) - убедитесь, что " не предшествует.
      • (?!['"]) - убедитесь, что " не продолжается.
  2. Разрешить определенные символы (положительный взгляд вперед / назад)
    • Этот метод позволяет вамчтобы указать символ, набор символов или подстроку для обеспечения совпадения.
    • (?<=\s|^)\bstring\b(?=\s|$) - смотрите здесь в использовании
      • (?<=\s|^) - гарантируйте пробел илиначало строки предшествует.
      • (?=\s|$) - убедитесь, что пропущен пробел или конец строки.
  3. Комбинация обоих выше
    • Этот метод позволяет вам отрицать конкретные случаи, в то же время разрешая другие (не часто используемые и не очень необходимые дляпроблема, но может быть полезна вам или другим.
    • Что-то вроде (?<=\s|^)string(?!\s+(?!stop)|$) будет гарантировать, что за словом не следует слово stop
    • Что-то вроде (?<=(?<!stop\s*)\s+|^)string(?=\s+|$) будет гарантироватьслово не следует за словом stop - обратите внимание, что квантификаторы (\s+) в видоискателях не разрешены в большинстве движков регулярных выражений, .NET допускает это. слово не находится в конце строки (отличается от конца строки, если многострочный).
1 голос
/ 09 октября 2019

Это регулярное выражение выберет string , если оно находится между пробелами: \sstring\s

var sample = "\"string\" string \"string\" astring 'string_ string?string string ";
var regx = new Regex(@"\sstring\s");
var matches = regx.Matches(sample);
foreach (Match mt in matches)
{
    Console.WriteLine($"{mt.Value} {mt.Index,3} {mt.Length,3}");
}
...