【问题标题】:scala pattern matching with regexp lookbehind operatorscala模式匹配正则表达式lookbehind运算符
【发布时间】:2015-10-31 03:56:19
【问题描述】:

我正在尝试使用正则表达式和模式匹配从字符串中提取值:

val reg = """((?<=a)b)""".r
"ab" match { case reg(x) => x }

无论我如何尝试,它仍然会引发 MatchError。但是,如果我尝试以下方法:

reg.findAllIn("ab").mkString

正则表达式的行为符合预期:res28: String = b

当然,我可以简单地更改正则表达式并添加另一个组:

val reg = """(a)(b)""".r
"ab" match { case reg(_,x) => x }

但我想知道是否可以在模式匹配中使用前瞻/后向运算符。

提前谢谢你。

【问题讨论】:

    标签: regex scala pattern-matching


    【解决方案1】:

    是的,但是在一个模式中将don't get a call 匹配到Matcher.find,就像在Regex.findAllIn 中所做的那样,所以你必须使用Regex.unanchored 将它变成UnAnchoredRegex(或者匹配第一个中的所有内容走):

    val reg = "((?<=a)b)".r.unanchored
    // ".*((?<=a)b)".r would also work
    "ab" match { case reg(x) => x }
    

    ScalaDoc 中的关键条目是:

    此方法默认尝试匹配整个输入;要查找下一个匹配子序列,请使用未锚定的正则表达式。

    (强调我的)。

    【讨论】:

    • unanchored 曝光不足。
    • @som-snytt:曝光是什么意思?
    • 如在新闻中提及,以便人们知道使用它。你不会,来自 java。
    猜你喜欢
    • 2014-05-06
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多