【问题标题】:Regex matching a character different from the first正则表达式匹配不同于第一个字符的字符
【发布时间】:2018-12-17 00:22:36
【问题描述】:

我正在尝试使用正则表达式来匹配这样的模式:

(任何字母)(不同的字母)(再次出现相同的字母)

例如:

这些都是有效的例子:

aba
bcb
dbd

这些无效:

aab
aaa
bac

我正在尝试这样做:

(.)[^\1]\1

但是,这仍然匹配第二个字母与第一个字母相似的情况(例如:aaa)。见这里:http://rubular.com/r/TTGEcyhE9g

正则表达式中有没有办法匹配any letter except the captured one

【问题讨论】:

  • 您确定[^\1] 是否有效?我的理解是不能将反向引用放入字符类中,因为后者需要一个硬编码的字符列表。
  • 我明白了,也许这就是问题所在。在这种情况下我该怎么办?
  • 使用前瞻限制字符:/(.)(?!\1).\1/.
  • @WiktorStribiżew 不错的一个......这可能是一个答案:-)

标签: ruby regex pattern-matching


【解决方案1】:

反向引用在字符范围内无效。正如下面 Wiktor Stribiżew 所解释的,您在此处定义原始字符,在您的情况下为 \x01(SOH,标题开始)字符。

作为一种解决方法,您可以按如下方式使用负前瞻:

(.)(?!\1).\1

在这里,您匹配的任何字符后面不是相同的字符(未消耗),然后是任何字符(但由于负前瞻而不同的字符),然后是第一个字符。

您可以在Ruby documentation 中了解有关前瞻和后瞻的更多信息。

【讨论】:

  • 您可以添加 [^\1] 匹配除 \x01 字符以外的任何字符(SOH,标题开始)。要使. 匹配任何字符,请添加m 修饰符。
【解决方案2】:

如果您喜欢使用正则表达式,那么 Wiktor 的建议可以满足您的需求。但是,编写一个基本的 Ruby 脚本来执行断言很容易:

input = "aea hello"
if input[0] == input[2] && input[0] != input[1]
    print "match"
else
    print "no match"
end

【讨论】:

  • 谢谢。正则表达式是更大正则表达式的一部分,因为我更喜欢使用 wiktor 的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2011-12-04
  • 2012-09-17
  • 2019-12-13
  • 2017-02-09
相关资源
最近更新 更多