【问题标题】:how to add conditions for regular expression?如何为正则表达式添加条件?
【发布时间】:2017-01-22 01:09:18
【问题描述】:

我必须得到以=" 开头并以下一个" 结尾的字符串。但它应该包含< 符号。

(="([^"])*<*")

字符串:

dit niet "dit wel" dit ook niet ="maar <dit ""en""dit ook"
REM dit niet "dit <wel" dit ook niet ="maar dit ""en""dit ook"
dit niet "dit wel" REM "maar dit ""en""dit ook"

上面的代码给了我两个字符串,我只需要得到下面提到的一个。

预期结果:

="maar <dit "

实际结果:

="maar <dit "
="maar dit "

注意: 需要得到所有以=" 开头并具有&lt; 并以下一次出现" 结尾的结果

【问题讨论】:

    标签: javascript java regex string regular-language


    【解决方案1】:

    将你的正则表达式切换到

    (="([^"]*<[^"]*)*")
    

    直播here

    这部分([^"]*&lt;[^"]*)确保你的内部字符串包含&lt;

    【讨论】:

    • 有一些不必要的回溯你的第一个 [^"]* 原因,因为它也匹配 &lt;。请参阅我的回答如何简化模式。
    【解决方案2】:

    您的="([^"])*&lt;*" 正则表达式匹配=",然后它会捕获除" 以外的任何字符重复(因此只有最后一次出现的字符会保存在第 1 组缓冲区中),并且然后零个或多个&lt; 符号 后跟"。因此,您的正则表达式并不真正要求 &lt; 出现在您匹配的字符串中。

    你可以使用

    ="([^"<]*<[^"]*)"
    

    regex demo

    详情

    • =" - =" 序列
    • ([^"&lt;]*&lt;[^"]*) - 将保存值的第 1 组:
      • [^"&lt;]* - 除了"&lt; 之外的零个或多个字符
      • &lt; - &lt; 符号
      • [^"]* - 除了" 之外的零个或多个字符
    • " - 双引号

    【讨论】:

    • 如果你关心不必要的回溯,你应该考虑使用*+而不是*。虽然您的答案避免了匹配情况下的回溯,但引擎可能会在不匹配情况下浪费时间,在不可能包含它们的位置搜索字符。
    • @Holger JS 正则表达式不支持所有格量​​词。
    • 好的,这个问题被标记为[javascript] [java],这引起了一些混乱。我认为,OP 应该决定其中之一……
    • 是的,当有两个引擎要支持时,模式应该由最不强大的一个支持:(
    猜你喜欢
    • 2020-01-07
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2012-12-09
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多