【问题标题】:Regex to Find Anything Between Multiple Delimiters正则表达式查找多个分隔符之间的任何内容
【发布时间】:2014-04-12 00:06:12
【问题描述】:

我正在尝试使用基于 Java 的正则表达式引擎/解释器来匹配不同分隔符之间的任何内容。我追求的文本是 server.domain.com 我不相信我也可以使用任何 Java,只能使用正则表达式。日志将只有一个或另一个,永远不会两者兼而有之。这必须使用单个正则表达式来完成,否则必须重新编写应用程序。

日志示例:

Host = server.domain.com|

Host="server.domain.com"

到目前为止,我已经尝试了以下以及其他一些组合...

Host="(.*?)"|Host\s=\s(.*?)\|

我还必须使用 Host 作为分隔符的一部分,因为它是从包含许多其他类似部分的日志中解析出来的。

感谢您对此的任何帮助!

【问题讨论】:

  • 还有可以嵌入双引号/管道符号吗?
  • 我正在尝试提取 server.domain.com 文本顺便说一句。 =)
  • Stack Overflow Regular Expressions FAQ 中有两个问题可能会有所帮助,它们都列在“常见验证任务 > Internet”下:matching urlshost/port part
  • 亲爱的 aliteralmind 先生,我非常感谢您!我刚刚了解了使用非捕获组,并且成功了!请参阅下面的答案...

标签: java regex


【解决方案1】:

对于给出的示例,您可以使用:

^Host\s*=\s*(?:")?(?:[^|"])+[|"]$

Debuggex Demo

它也会接受

host=server.domain.com"

但如果日志是/或,那应该不是问题。

【讨论】:

  • 这是正确的方法。正则表达式不是您要验证分隔符是否匹配的工具。
  • 这是一个很好的回应和解释,但它不起作用。我什至尝试删除锚点,但什么都没有... =/ 它突出显示了整个选择,而不仅仅是 server.domain.com。
【解决方案2】:

用这两个字符串试试这个

    String str1 = "Host = server.domain.com|";
    String str2 = "Host=\"server.domain.com\"";

    //Host(no or one space)=(" or one space)server.domain.com(| or ")
    Pattern p = Pattern.compile("Host\\s?=[\\\"|\\s]server.domain.com[\\||\\\"]");
    Matcher m = p.matcher(str1);
    if (m.find()) {
        System.out.println("found");
    }

如果在等于的任一侧都没有空格,你也可以试试这个。

//Host(zero or more spaces)=(zero or more spaces)(" or spaces)server.domain.com(" or |)
Pattern p = Pattern.compile("Host\\s*=\\s*[\\\"|\\s*]server.domain.com[\\\"|\\|]");

【讨论】:

  • 我尝试了两个正则表达式,但它不匹配任何东西。另外,我没有使用任何代码,只使用正则表达式。
  • 该死的你们摇滚!谢谢布拉杰
  • 现在您可以在这里测试您的正则表达式,请告诉我在我的帖子中给定的正则表达式不匹配的模式。
【解决方案3】:

感谢文字思维,我了解了非捕获组,这是关键......

看哪!...

主机(?:\s=\s|=\")(.*?)(?:\||\")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多