regex 为什么这个正则表达式匹配一个大于10个所需字符的字符串?

enxuqcxy  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(118)

我有下面的正则表达式,我使用https://www.regextester.com/来测试它。

^(?=^.{10})[a-zA-Z]+:[0-9]+\s*

要求是输入可以是字母字符和数字,由冒号分隔,并带有一些尾随空格。输入必须以字母字符开头,但在尾随空格或我不想匹配的第10个数字之后可能有多余的字符。要匹配的字符串必须正好是10个字符。在下面的示例字符串中,我对我认为匹配的字符串进行了加粗。我没有在末尾锚定一个$,因为我知道输入字符串可能有10个以上的字符,所以我没有试图检查整个字符串是否匹配。

A:12345678// matches which is fine
A:123456789 //最多只能匹配8
FOO:567890s123 //只能匹配到0

实际的结果是,它也匹配第10个字符之后的所有字符,只要它是字母数字或空格。我希望它能匹配到第10个字符,仅此而已。我该如何修正这个表达式?
更新:我最终会尝试将这个正则表达式合并到一个C++程序中,使用boost正则表达式进行匹配。

l5tcr1uw

l5tcr1uw1#

如果支持的话,你可以使用一个lookbehind,在模式的末尾向左Assert10个字符:

^[A-Za-z]+:[0-9]+(?<=^.{10})

模式匹配:

  • ^字符串开头
  • [A-Za-z]+:[0-9]+匹配1+字符A-Za-z,后跟:和1+数字
  • (?<=^.{10})正向后查找,Assert从当前位置向左有10个字符

Regex demo
如果要匹配尾随空格字符:

^[A-Za-z]+:[0-9]+\s*(?<=^.{10})

注意\s也可以匹配换行符。

bvjxkvbb

bvjxkvbb2#

(?=^.{10})确保字符串至少有10个字符,但没有更多。
为了确保前10个字符与主表达式匹配,您仍然需要一个锚。但是,它必须不仅仅是$

^                  # At the start of the string
(?=.{10}(.*))      # lookahead to 10 characters and capture the rest of the line
[A-Za-z]+:[0-9]+   # then try to match the main expression
(?=                # before ensuring that what follows it
  \h*\1$           # is the same group 1 preceded by some horizontal whitespaces, if any.
)                  #

试试on regex101.com
请注意,如果主要部分短于10个字符,则上面的表达式也会修剪尾随空格。如果您确实希望在匹配中包含尾随空格,请将\h*移到第二个lookahead之外:

^(?=.{10}(.*))[A-Za-z]+:[0-9]+\h*(?=\1$)

试试on regex101.com
这个技巧在另一个问题中被an answer of mine部分覆盖。

pcww981p

pcww981p3#

使用捕获组来匹配所需的10个字符。

Regex:

^([a-zA-Z]+:[0-9]{1,8}\s{0,2})(?<!\s).{0,}$
xkrw2x1b

xkrw2x1b4#

  • "...输入可以是字母字符和数字,用冒号分隔……[和]必须以字母字符开头.要匹配的字符串必须正好是10个字符。..."*

您可以利用多个结构来帮助缩小匹配范围。

^(?=[A-Z]{1,8}:\d{1,8}\d)[^:]+:\d+?(?<=[A-Z].{9})

这是一个细分。

  • 使用 look-ahead 来Assert值和值的顺序
^(?=[A-Z]{1,8}:\d{1,8}\d)
  • 限定图案
[^:]+:\d+?
  • 使用 look-behind 来完成条件,以Assert起始值,从而Assert总匹配长度
(?<=[A-Z].{9})

我不确定你使用的是什么 * 正则表达式引擎 *,这里有一个使用 JavaScript 的例子。

var a = ['A:12345678', 'A:123456789', 'FOO:567890s123']
var p = /(?=[A-Z]{1,8}:\d{1,8}\d)[^:]+:\d+?(?<=[A-Z].{9})/g
a.forEach(x => console.log(x.match(p)));

相关问题