Regex 从提取器中获取列表--甚至是匹配

Regex 从提取器中获取列表--甚至是匹配,regex,scala,Regex,Scala,首先,我很酷 然后我就像是该死的 [如果我的问题不明显:我如何得到一个模式实际匹配的所有子组的列表,理想情况下是在提取器中,但在任何情况下都不需要编写第二级匹配器。这里的正确答案是列表(u,o,I,e,a)。]据我所知,不可能转换(e)类型的子模式*在正则表达式中转换为字符串列表。这是因为Scala中使用的正则表达式机制是使用JDK的正则表达式默认实现(java.util.Pattern、java.util.Matcher等)实现的,而该实现不支持捕获子模式的多样性。在匹配的情况下,子模式(E)

首先,我很酷

然后我就像是该死的


[如果我的问题不明显:我如何得到一个模式实际匹配的所有子组的列表,理想情况下是在提取器中,但在任何情况下都不需要编写第二级匹配器。这里的正确答案是
列表(u,o,I,e,a)
。]

据我所知,不可能转换(e)类型的子模式*在正则表达式中转换为字符串列表。这是因为Scala中使用的正则表达式机制是使用JDK的正则表达式默认实现(java.util.Pattern、java.util.Matcher等)实现的,而该实现不支持捕获子模式的多样性。在匹配的情况下,子模式(E)*将仅捕获该子模式的最后一个匹配。据我所知,这种行为甚至适用于大多数正则表达式实现

虽然我认为您的案例是您实际问题的简化版本,但针对所述案例确实存在一个简单的解决方案:

scala> "[aeiou]".r findAllIn "hello, world!" toList
res1: List[String] = List(e, o, o)

希望这会有所帮助。

据我所知,不可能将正则表达式中(E)*类型的子模式转换为字符串列表。这是因为Scala中使用的正则表达式机制是使用JDK的正则表达式默认实现(java.util.Pattern、java.util.Matcher等)实现的,而该实现不支持捕获子模式的多样性。在匹配的情况下,子模式(E)*将仅捕获该子模式的最后一个匹配。据我所知,这种行为甚至适用于大多数正则表达式实现

虽然我认为您的案例是您实际问题的简化版本,但针对所述案例确实存在一个简单的解决方案:

scala> "[aeiou]".r findAllIn "hello, world!" toList
res1: List[String] = List(e, o, o)

希望这会有所帮助。

这将让您提取模式:

scala> var listOfVowels(vowels @ _*) = "uoiea"
vowels: Seq[String] = List(uoiea, a)

然而,该模式并没有达到您期望的效果——它不会生成多个组。正则表达式库规则是一组括号、一个组,我知道的每个正则表达式都是这样工作的。

这将让您提取模式:

scala> var listOfVowels(vowels @ _*) = "uoiea"
vowels: Seq[String] = List(uoiea, a)

然而,该模式并没有达到您期望的效果——它不会生成多个组。正则表达式库规则是一组括号,一个组,我知道的每个正则表达式都是这样工作的。

这在风格上有点马虎

scala> implicit def mkRr(regex: String) = new { def rr = new { def unapply(s: String) = (regex.r findAllIn s toList) match { case Nil => None ; case xs => Some(xs) } } }
mkRr: (regex: String)java.lang.Object{def rr: java.lang.Object{def unapply(s: String): Option[List[String]]}}

scala> val ListOfVowels = "[aeiou]".rr
ListOfVowels: java.lang.Object{def unapply(s: String): Option[List[String]]} = $anon$1$$anon$2@49f2afad

scala> val ListOfVowels(vowels) = "uoiea"
vowels: List[String] = List(u, o, i, e, a)

这在风格上有点马虎

scala> implicit def mkRr(regex: String) = new { def rr = new { def unapply(s: String) = (regex.r findAllIn s toList) match { case Nil => None ; case xs => Some(xs) } } }
mkRr: (regex: String)java.lang.Object{def rr: java.lang.Object{def unapply(s: String): Option[List[String]]}}

scala> val ListOfVowels = "[aeiou]".rr
ListOfVowels: java.lang.Object{def unapply(s: String): Option[List[String]]} = $anon$1$$anon$2@49f2afad

scala> val ListOfVowels(vowels) = "uoiea"
vowels: List[String] = List(u, o, i, e, a)

每个ReqExAPI都可能以这种方式工作,但底层库肯定支持嵌套组。Scala API可能不是唯一一个不公开嵌套组的,但我已经习惯了Scala在大多数其他语言都很糟糕的地方不那么糟糕。啊,好吧,对完美的追求还在继续。@Malvolio啊,好吧,我会答应你的。我希望它也能起作用。唉,我对Scala的Regex有着漫长的爱与恨的故事。它让人瞥见了天堂,但却没能坚持到底。如果我选择了一个好的API,我现在就已经做了一个替换库了。每个reqex API都可以这样工作,但是底层库肯定支持嵌套组。Scala API可能不是唯一一个不公开嵌套组的,但我已经习惯了Scala在大多数其他语言都很糟糕的地方不那么糟糕。啊,好吧,对完美的追求还在继续。@Malvolio啊,好吧,我会答应你的。我希望它也能起作用。唉,我对Scala的Regex有着漫长的爱与恨的故事。它让人瞥见了天堂,但却没能坚持到底。如果我选择了一个好的API,我现在就已经做了一个替换库了。