Regex, чтобы найти последнее слово (включая символы) в строке - PullRequest
1 голос
/ 25 июня 2019

Я изо всех сил пытаюсь найти последнее слово в строке. Слово может включать такие символы, как! @ # $% ^ & * [] И т. Д. Это должно работать для наборов символов Юникода.

Регулярному выражению необходимо вернуть две группы (обе игнорируют пробелы в конце строки)

Это то, что я пробовал до сих пор (.*\b(\w+))\W*$, но оно не работает с символами в слове.

'this test' => 'this test' and 'test'
' this test ' => 'this test' and 'test'
'this test$' => 'this test$' and 'test$'
'this# test$  ' => 'this# test$' and 'test$'

Ответы [ 4 ]

2 голосов
/ 25 июня 2019

Мы можем попытаться просто разбить входную строку на пробел, а затем взять последнюю запись для опции без регулярных выражений:

string input = "this# test$";
string[] parts = input.Split(null);
string last = parts[parts.Length - 1];
Console.WriteLine(last)

Это печатает:

test$

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

\S+$

Это будет захватывать все непрерывные непробельные символы, которые появляются непосредственно перед концом ввода.

0 голосов
/ 25 июня 2019

Это может быть немного широкое соответствие, но вы можете использовать 2 группы захвата, используя \S, что будет соответствовать непропущенному символу.Вы можете обновить его, чтобы он точно соответствовал тому, что вы хотите, чтобы сделать его более конкретным, используя, например, категории юникода .

Например, вы можете использовать класс символов [\p{L}\p{N}_!@#$%^&*[\]], чтобы соответствовать любомувид буквенно-цифровых символов, используя \p{L} и \p{N}, за которыми следуют специальные символы, которые вы разрешите.

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

Во второй группе захватывает последнее слово.

(\S+\s+(\S+))\s*$

Пояснение

  • ( Группа захвата 1
    • \S+\s+ Совпадение 1+ без пробельных символов, совпадение с 1+ пробелами
    • (\S+) Захват группы 1, совпадение с 1+ без пробелов
  • ) Закрыть группу захвата
  • $ Конец строки

Демонстрация регулярных выражений с \S | .NET Демо со специальными символами

0 голосов
/ 25 июня 2019

Это регулярное выражение Юникода будет делать то, что вы хотите:

(\p{L}+\P{L}?\p{Zs}+(\p{L}+\P{L}?))(?<!\p{Zs})

Детали регулярного выражения:

  • \p{L}+ соответствует одному или нескольким символам Юникода в категории "буква".
  • \P{L}? соответствует одному необязательному Unicode-символу, не относящемуся к категории «буква».
  • \p{Zs}+ соответствует одному или нескольким пробелам.
  • (?<!\p{Zs}) отрицательный вид сзади, который предотвращаетсовпадение пробела в конце строки.

Демо

0 голосов
/ 25 июня 2019

Если у вас есть опция RegexOptions.Multiline:

(?<=\s)([^\s][\S]{0,})(?=[\s]*?$)

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...