使用正则表达式从字符串中提取包含括号 '(' 的子字符串

4

我正在尝试从一个包含括号的字符串中提取子字符串,但是Java会提示未被正确封闭,如果我尝试转义它,则会报错并提示无效的转义字符。

我有以下字符串:

[Monitor Status](/monitors#2972550?)] · [[Edit Monitor](/monitors#2972550/edit)] · [[Related Logs](/logs?query=)]
%%%

我正在尝试提取 /monitors# 后面的数字。这个数字在两个位置上都出现,而且总是相同的,所以我只想提取第一个数字。

以下是我目前的代码:

Pattern pattern = Pattern.compile("[Monitor Status]/monitors#(\\d+)");                   
Matcher matcher = pattern.matcher(monitorDetails);
if (matcher.find())
{
     String monitor_id = matcher.group(1);
     monitorDetailsContainer.setVisibility(View.VISIBLE);
}

以上内容中,我在]和/monitors之间没有(,但是当我在Android Studio中这样做时,它会显示未关闭的组。如果我尝试转义斜杠 \(,它会显示非法转义字符。

我期望得到的结果是2972550


3
应为"\[监控状态\]\\(/monitors#(\\d+)" - Wiktor Stribiżew
1
@zzxyz 不,它不支持。Scala、Kotlin 支持。 - Wiktor Stribiżew
@WiktorStribiżew 哇。我的意思是...甚至C++也可以。 - zzxyz
@WiktorStribiżew - 对于那个貌似不伦不类的话,我很抱歉。我提到C++只是因为在语法和用法上它非常不友好。(依我之见) - zzxyz
嗨Boardy。我是这里的一位志愿编辑,我们使用技术写作的标准以及在Meta上商定的原则来编辑问题。我注意到你的问题有点啰嗦,如果可以的话,请让它们更简明扼要。特别是,你有499个帖子包含各种感谢的话语,但我们不希望添加这些,请看这里。这里的讨论也非常有用。 - halfer
显示剩余2条评论
1个回答

6
你在输入数字时漏了一些字符,并未成功转义 (, )[,请使用。
Pattern pattern = Pattern.compile("\\[Monitor Status]\\(/monitors#(\\d+)");                   
Matcher matcher = pattern.matcher(monitorDetails);
if (matcher.find())
{
     String monitor_id = matcher.group(1);
     monitorDetailsContainer.setVisibility(View.VISIBLE);
}

这里有一个 正则表达式演示 和一个 在线 Java 演示

详细信息

  • \[ - 一个 [
  • Monitor Status - 一个文本字符串
  • ] - 一个字面意义下的 ]
  • \( - 一个字面意义下的 (
  • / - 一个 /
  • monitors# - 一个文本字符串
  • (\d+) - 第一组:一个或多个数字。

1
谢谢,这正是我想要的。我没有意识到方括号需要转义,我以为正则表达式模式只在圆括号内部,其他任何内容都是字面字符串。 - Boardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接