正则表达式查找在线上的最后一个单词(包括符号)

时间:2019-06-25 01:35:36

标签: .net regex

我正在努力寻找一行的最后一个单词。该单词可能包含!@#$%^&* []等符号。这需要使用Unicode字符集。

正则表达式需要返回两组(都忽略该行末尾的空白)

这是我到目前为止尝试过的(.*\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 个答案:

答案 0 :(得分:2)

对于非正则表达式选项,我们可以尝试在空间上分割输入字符串,然后获取最后一个条目:

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

此打印:

test$

如果要使用正则表达式,请尝试按以下模式进行匹配:

\S+$

这将捕获所有紧接在输入结尾之前的连续非空白字符。

答案 1 :(得分:0)

假设您在RegexOptions.Multiline上有以下选择:

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

Demo

答案 2 :(得分:0)

此Unicode正则表达式将执行您想要的操作:

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

正则表达式详细信息:

  • \p{L}+匹配“字母”类别中的一个或多个unicode字符。
  • \P{L}?匹配一个不属于“字母”类别的可选Unicode字符。
  • \p{Zs}+匹配一个或多个空格。
  • (?<!\p{Zs})后面的否定性防止在字符串末尾匹配空格。

Demo

答案 3 :(得分:0)

这可能有点广泛,但是您可以使用\S使用2个捕获组,这将匹配一个非空白字符。您可以使用unicode categories进行更新,使其与您要匹配的内容完全匹配,以使其更加具体。

例如,您可以使用字符类[\p{L}\p{N}_!@#$%^&*[\]]来匹配任何类型的字母/数字字符,并使用\p{L}\p{N}以及允许的特殊字符。

在第一组中,还捕获了第二组,其中包括中间的空格以获取完全匹配而没有结尾空格。

第二组中捕获最后一个单词。

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

说明

  • (捕获组1
    • \S+\s+匹配1+个非空白字符,匹配1+个空白字符
    • (\S+)捕获组1,匹配1个以上非空格字符
  • )关闭捕获组
  • $字符串结尾

Regex demo with \S | .NET Demo with special characters