regex - 如果正则表达式有嵌套组,如何使用正则表达式来匹配字符串?

标签 regex scala pattern-matching

有一些字符串:

111/aaa
111/aaa|222/bbb

它们的表达形式是:

(.*)/(.*)(|(.*)/(.*))?

我尝试用它来匹配字符串并提取值:

var rrr = """(.*)/(.*)(|(.*)/(.*))?""".r

"123/aaa|444/bbb" match {
    case rrr(pid,pname, cid,cname) => println(s"$pid, $pname, $cid, $cname")
    case _ => println("not matched ?!")
}

但它打印:

not matched ?!

我想要得到:

123, aaa, 444, bbb

如何解决?

<小时/>

更新

感谢@BartKiers和@Barmar的回答,我发现我的正则表达式有几个错误,最后找到了这个解决方案:

var rrr = """(.*?)/(.*?)([|](.*?)/(.*?))?""".r

"123/aaa|444/bbb" match {
    case rrr(pid,pname, _, cid,cname) => println(s"$pid, $pname, $cid, $cname")
    case _ => println("not matched ?!")
}

它可以工作,但是你可以看到有一个实际上没有用的_。有什么方法可以重新定义正则表达式,我只需编写 rrr(pid,pname,cid,cname) 来匹配它?

最佳答案

.* 可能会导致大量回溯,因为 .* 会首先匹配完整字符串,然后逐个返回,直到匹配第一个 /.

它也不会像您期望的那样正确捕获组中的值..

您应该使用.*?

你的正则表达式应该是

^(.*?)/(.*?)(?:\|(.*?)/(.*?))?$

小字符串不会有任何性能差异,但它会捕获正确组中的值

注意正则表达式中的 ?:,这意味着不捕获组 (?:\|(.*?)/(.*?))?。所以结果只是 4 个子组。

关于regex - 如果正则表达式有嵌套组,如何使用正则表达式来匹配字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17482843/

相关文章:

F#:使用区分联合解构绑定(bind)

Scala 捕获对象引用,同时仍然使用提取器

python - 添加重新编译到列表

multithreading - 同步执行上下文的不确定性(又名 `parasitic`)

scala - 如何整合 Sass 和 Play 2.3?

scala - 在 Scala 中交换不同类型的元组

用于 diffstat 输出的 Python 正则表达式

android - 如何搜索特定格式的电子邮件列表?

python - 尝试用反转的匹配捕获组替换与 pandas 数据框中的模式匹配的所有值

Scala:具有可重用条件的模式匹配