Java 当字符串包含多行时,无法将该字符串与正则表达式模式匹配

Java 当字符串包含多行时,无法将该字符串与正则表达式模式匹配,java,regex,Java,Regex,我有一个字符串,如下所示: 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 extractorPatte

我有一个字符串,如下所示:

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);
}
我遇到的问题是,两行上的这个字符串与我的正则表达式不匹配,即使同一个正则表达式似乎可以正常工作

我的测试状态:

  • 如果我没有多行(例如,如果我只有
    SYBASE=…
    后跟新行),它将匹配
  • 如果我计算表达式
    extractorPattern.matcher(“SYBASE\u OCS=OCS-12\u 5\\nSYBASE=/opt/SYBASE/oc12.5.1-EBF12850\\n”)
    (注意新行前面的双反斜杠),它将匹配
  • 我已尝试使用
    变量定义。将(“\n”,“\\n”)
    替换为我给
    匹配器()的内容,但它不匹配
这似乎很简单,但我无法摆脱它。有人能帮忙吗


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

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

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

通过将其指定为
模式的参数。编译

Pattern.compile("regex", Pattern.MULTILINE)
或者使用嵌入的标志表达式:
(?m)

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


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

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

通过将其指定为
模式的参数。编译

Pattern.compile("regex", Pattern.MULTILINE)
或者使用嵌入的标志表达式:
(?m)

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


非常感谢您提供的解决方案和清晰的解释非常感谢您提供的解决方案和清晰的解释