繁体   English   中英

当这样的字符串由多行完成时,无法将字符串与正则表达式模式匹配

[英]Cannot match string with regex pattern when such string is done of multiple lines

我有一个如下字符串:

SYBASE_OCS=OCS-12_5
SYBASE=/opt/sybase/oc12.5.1-EBF12850
//there is a newline here as well

调试器中的字符串如下所示:

在此处输入图像描述

我正在尝试匹配SYBASE=之后的部分,这意味着我正在尝试匹配/opt/sybase/oc12.5.1-EBF12850

为此,我编写了以下代码:

String key = "SYBASE";
Pattern extractorPattern = Pattern.compile("^" + key + "=(.+)$");
Matcher matcher = extractorPattern.matcher(variableDefinition);
if (matcher.find()) {
    return matcher.group(1);
}

我遇到的问题是 2 行上的这个字符串与我的正则表达式不匹配,即使相同的正则表达式似乎在regex 101上工作正常。

State 我的测试:

  • 如果我没有多行(例如,如果我只有SYBASE=...后跟新行),它将匹配
  • 如果我评估表达式extractorPattern.matcher("SYBASE_OCS=OCS-12_5\\nSYBASE=/opt/sybase/oc12.5.1-EBF12850\\n") (注意新行前面的双反斜杠),它将匹配.
  • 我尝试将variableDefinition.replace("\n", "\\n")用于我给matcher()的内容,但它不匹配。

这似乎很简单,但我无法摆脱它。 有人可以帮忙吗?

注意:该格式的字符串由 shell 命令返回,我无法真正改变它的返回方式。

^$将匹配锚定到输入的开始和结束。

在您的情况下,您希望匹配输入字符串中一行的开头和结尾。 为此,您需要更改这些锚点的行为。 这可以通过使用多行标志来完成。

通过将其指定为Pattern.compile的参数:

Pattern.compile("regex", Pattern.MULTILINE)

或者通过使用嵌入的标志表达式: (?m)

Pattern.compile("(?m)^" + key + "=(.+)$");

它似乎在 regex101.com 中起作用的原因是它们默认添加了全局和多行标志:

regex101 的默认标志

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM