【问题标题】:Regex to find last word (including symbols) on line正则表达式在线查找最后一个单词(包括符号)
【发布时间】:2019-06-25 01:35:36
【问题描述】:

我很难在一行中找到最后一个单词。这个词可能包括像 !@#$%^&*[] 等符号。这需要适用于 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$'

【问题讨论】:

    标签: .net regex


    【解决方案1】:

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

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

    打印出来:

    test$
    

    如果您想要正则表达式方法,请尝试匹配以下模式:

    \S+$
    

    这将捕获出现在输入结束之前的所有连续的非空白字符。

    【讨论】:

    • 我不能假设空间会起作用。一些 unicode 字符集不会用空格分隔单词。
    • 那么您需要告诉我们哪些字符划分了最后一个单词的结尾。鉴于您的实际问题,我在上面写的内容是我所知道的最佳解决方案。
    • 我想我不能告诉你。它是特定于语言的。有些语言没有空格的概念,它是内置在单词或字符中的。这就是我说 unicode 字符集的原因。
    【解决方案2】:

    假设您有 RegexOptions.Multiline 选项:

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

    Demo

    【讨论】:

      【解决方案3】:

      这个 unicode 正则表达式会做你想做的事:

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

      正则表达式详细信息:

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

      Demo

      【讨论】:

        【解决方案4】:

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

        例如,您可以使用字符类 [\p{L}\p{N}_!@#$%^&amp;*[\]] 来匹配任何类型的字母/数字字符,使用 \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

        【讨论】:

          猜你喜欢
          • 2013-12-06
          • 1970-01-01
          • 2022-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多