Java 具有前瞻表达式的匹配组

Java 具有前瞻表达式的匹配组,java,regex,scala,Java,Regex,Scala,我对包含前瞻表达式的匹配组有问题。我不知道为什么这个表达式不起作用: """((?<=^)(.*)(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%))((?<=[\w:]\s)(\w+)(?=\s[cr]))""" 已使用此工具检查表达式: 我的Scala代码: import scala.util.matching.Regex val text = "May 5 23:00:01 10.14.3.10 %ASA-6-302015: Built

我对包含前瞻表达式的匹配组有问题。我不知道为什么这个表达式不起作用:

"""((?<=^)(.*)(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%))((?<=[\w:]\s)(\w+)(?=\s[cr]))"""
已使用此工具检查表达式:

我的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)
import scala.util.matching.Regex
val text=“5月5日23:00:01 10.14.3.10%ASA-6-302015:内置入站UDP连接”
val regex=新的regex(“”)(?多重匹配
您可以根据需要修改图案

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

请注意,一旦模式与
.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)
} 

请参阅。由于
match
需要完整的字符串匹配,因此在模式末尾添加了
*
,并且模式中只保留相关的未转义
(…)
。请参阅。

您的匹配项彼此不相邻, 试试这个:

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

(?您是否正在尝试获取
May 5 23:00:01
UDP
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
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)
} 
"""((?<=^)(.*)(?=\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s%)).*((?<=[\w:]\s)(\w+)(?=\s[cr]))"""