【问题标题】:Regex to find string not followed by another string before a character正则表达式查找字符前没有后跟另一个字符串的字符串
【发布时间】:2013-12-18 20:12:41
【问题描述】:

为什么这个正则表达式不为这个字符串返回真值:X1_Y1

'.*X1_(?!(Y3|_))(_.*|$)'

由于 X1_ 在到达下划线或字符串结尾之前没有跟随 Y3,因此字符串 X1_Y1 应该是匹配的。我的正则表达式有什么问题?

【问题讨论】:

  • 如果要Y1匹配第二组,需要将第二组中的_.*改为.*
  • Blue 的右侧从第二次捕获中删除下划线
  • 这仅适用于我给出的简单示例,但对于 X1_Y1Y3_H5 也将返回 true。这是不正确的,因为我不希望它返回为真,因为在 X1 之后但在下一个下划线之前的字符串中确实存在 Y3 字符串。

标签: regex regex-negation regex-lookarounds


【解决方案1】:

你的表达可以简化:

 .*X1_(?!(Y3|_))(_.*|$)

等效于(用于匹配目的并忽略捕获组):

 X1_(?!Y3)(?!_)(_.*|$)

由于负前瞻不允许X1_之后的字符成为下划线,因此进一步简化为:

 X1_(?!Y3)(?!_)$

而且由于这个表达式需要X1_ 来结束字符串,因此负前瞻没有进一步的功能。表达式简化为:

X1_$

大概,这不是本意。

【讨论】:

  • 为了更清楚地说明问题 - 我想知道有一个 X1 在它后面的字符串中没有 Y3,但在下一个下划线之前。如果我用英文写它会是:如果字符串包含 X1_ 后跟一个字符串 NOT CONTAINING Y3 后跟另一个下划线或字符串结尾,则返回 true。我希望以下匹配:X2_T4R5R6_X1_Y1T1Y1_ 以及 X4_U8Y8_X1_Y1 但不是 G6_H8H7H8_X1_Y7Y3Y9_。如果有任何 X1 后面没有 Y3,我也想返回 true,所以这也将返回 true:X1_Y3Y7_X1_Y1Y2
  • @user2792676 你可能想要的是类似于X1_(?![A-Z0-9]*Y3)[A-Z0-9]+ 的东西。如果输入包含 X1_ 后跟一系列不包含 Y3 的字母和数字,则匹配。
  • 这行得通 - 非常感谢。现在我看到了,似乎很清楚。
【解决方案2】:

在您提供的正则表达式中,没有任何内容与 Y1 部分匹配。 _ 已经与 X1_ 匹配,因此 _.* 部分将不匹配,$ 将不匹配,因为在字符串末尾之前还有 Y1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多