【问题标题】:Regex extract class path from string正则表达式从字符串中提取类路径
【发布时间】:2019-11-06 11:22:01
【问题描述】:

我正在尝试从字符串中提取类路径。字符串格式可以包含不同的类路径

(字符串示例:DEBUG(tab)a.b.c.d.classname#INFO(tab)a.classname#

我拥有的正则表达式:

如果路径(?:\w\.\w\.[^#]*) 中有多个点可以正常工作,但是当我添加|(?:[^\d]\w\.\w{1,9999}[^#]*) 时,如果类路径包含一个点(上面的第二个示例),它也会选择选项卡。基本上我想制作一个匹配任何类路径的正则表达式。如果类路径只有一个点,如何选择路径?

完整的字符串示例:

2019-01-01 01:01:01.000+0000 [id=1](tab_here)INFO(tab_here)a.package.classname#sometext: somemoretext

到目前为止,正则表达式的样子:

(?:\w\.\w\.[^#]*)|(?:[^\d]\w\.\w{1,9999}[^#]*)

更新

我想要的结果是一个没有tab 的类路径匹配,而它只包含一个dotthe result I have with tab..

更新 #2:

所有答案都很棒,但我不得不修改 Vincents 以达到我想要的效果。最终的正则表达式是

(\w+(?:\.\w+)+)(?=#)

想要前后都没有任何东西。结果和文森特的输出一样。

感谢所有参与的人!

【问题讨论】:

  • 我不明白你想要得到什么输出。您的问题中缺少的是具有预期输出的输入的明确示例。您提供了一些输入示例,但您想要什么输出?

标签: regex


【解决方案1】:

试试这样的解决方案:

\t([\w\.]+?)#

这将涵盖您提到的情况。但是,这可能需要进行某些改进以涵盖所有可能的类路径”

【讨论】:

    【解决方案2】:

    您可以匹配一个选项卡并使用一个匹配 1+ 个单词字符的捕获组,然后重复一个点,然后匹配一个 #

    这将阻止匹配,例如 .# .#

    如果不需要该选项卡,则可以省略它。

    \t(\w+(?:\.\w+)+)#
    
    • \t 匹配标签
    • ( 捕获第 1 组
      • \w+ 匹配 1+ 个单词字符
      • (?:\.\w+)+ 匹配 1+ 次一个点和 1+ 个单词字符
    • )关闭群
    • # 字面上匹配

    Regex demo

    【讨论】:

      【解决方案3】:

      也许我错过了什么,但我认为这比你所做的要容易得多。

      这对我有用:

      .*?([\w\.]+)#.* 替换为$1

      当然它会匹配像 2 个连续点这样的模式,它们不是有效的类路径,但它永远不会出现在您的输入日志中,那么为什么要为复杂性烦恼呢?

      在 Chrome 控制台中使用 javascript 进行测试:

      console.log("INFO   a.package.classname#sometext".replace(/.*?([\w\.]+)#.*/,"$1"))
      console.log("DEBUG(tab)a.b.c.d.classname#,sometext".replace(/.*?([\w\.]+)#.*/,"$1"))
      console.log("INFO(tab)a.classname#,sometext".replace(/.*?([\w\.]+)#.*/,"$1"))
      

      输出:

      a.package.classname
      a.b.c.d.classname
      a.classname
      

      .*?([\w\.]+)#.* 表示以# 结尾的任何字母和点序列(之前的.*? 和之后的.* 允许匹配该模式之前和之后的所有内容以便能够删除它)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2021-10-19
        相关资源
        最近更新 更多