java - 使用前瞻表达式匹配组

标签 java regex scala

我在匹配包含先行表达式的组时遇到问题。我不知道为什么这个表达式不起作用:

"""((?<=^)(.*)(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%))((?<=[\w:]\s)(\w+)(?=\s[cr]))"""

当我单独编译它们时,例如:

"""(?<=^)(.*)(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%)"""

我得到了正确的结果

我的示例文本:

May  5 23:00:01 10.14.3.10 %ASA-6-302015: Built inbound UDP connection

已使用此工具检查表达式:http://regex-testdrive.com/en/dotest

我的 Scala 代码:

import scala.util.matching.Regex
val text = "May  5 23:00:01 10.14.3.10 %ASA-6-302015: Built inbound UDP connection"
val regex = new Regex("""((?<=^)(.*)(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%))((?<=[\w:]\s)(\w+)(?=\s[cr]))""")
val result = regex.findAllIn(text)

有人知道这个问题的解决办法吗?

最佳答案

多重匹配

您可以将模式修复为

^.*?(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%)|(?<=[\w:]\s)\w+(?=\s[cr])

请参阅regex demo 。要点是引入 | 交替运算符来匹配 2 个子模式中的任何一个。请注意,您不需要将字符串 anchor 的 ^ 开头放入lookbehind,因为 ^ 已经是零宽度断言。另外,有太多的分组你似乎没有使用任何方式。另外,要匹配文字点,您需要对其进行转义(. -> \.)。

要获取多个匹配项,您可以使用以下代码片段:

val text = "May  5 23:00:01 10.14.3.10 %ASA-6-302015: Built inbound UDP connection"
val regex = """^.*?(?=\s\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\s%)|(?<=[\w:]\s)\w+(?=\s[cr])""".r
val result = regex.findAllIn(text)
result.foreach { x => println(x) }
// => May  5 23:00:01
//    UDP

请参阅Scala online demo .

请注意,一旦模式与 .FindAllIn 一起使用,默认情况下它不会被锚定,因此您将获得输入字符串中的所有匹配项。

捕获组

您可以使用的另一种方法是匹配整行,同时使用捕获组捕获必要的位:

val text = "May  5 23:00:01 10.14.3.10 %ASA-6-302015: Built inbound UDP connection"
val regex = """^(.*?)\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%.*[\w:]\s+(\w+)\s+[cr].*""".r
val results = text match {
  case regex(date, protocol) => Array(date, protocol)
  case _ => Array[String]()
}
// Demo printing
results.foreach { m =>
  println(m)
} 

参见another Scala demo 。由于 match 需要完整的字符串匹配,因此 .* 添加在模式末尾,并且仅相关的未转义的 (...) 对> 保留在模式中。请参阅regex demo here .

关于java - 使用前瞻表达式匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756279/

相关文章:

Scala:空和无

scala - 使用 SBT 将源文件复制到目标目录

java - 注释处理器

java - 对本例中 ConcurrentHashMap 和 HashMap 行为的区别感到困惑

scala - 从Scala中的目录读取文件

python - 如何使用 REGEX 替换字符串中分号的确切数量?

Java正则表达式和xml标签

java - Spring MVC : Mapping Multiple URLs to Same Controller

java - 数组索引问题

regex - 如何在 SQLite 查询中使用正则表达式?