【问题标题】:Specific Length Regular Expression With Padding带填充的特定长度正则表达式
【发布时间】:2017-06-22 17:22:07
【问题描述】:

目标:为较大字符串中的固定长度字符串生成通用正则表达式。此字符串具有指定的填充字符,后跟一个递增的整数计数器。理想情况下,可以通过某种方式说,“我希望这个组的长度为 10,并且只包含一种类型的字符,后跟一个不同的字符。”

我试图在变量数据中匹配这个(可能是数字可能是字母可能是符号): padding-characters + numbers 加起来是一个指定的长度,这里是 5。

这些是允许的填充 + 数字组合。

$$$$1
$$$12
$$123
$1234

这是一个例子:

<variable-data> <padding-characters> <numbers> <variable-data>
............... .................... ddddddddd ............... 
(where periods are any characters and 'd' is any digit)

Example Data:
ABC              $$$$                 1         $!@

Example Regex: 
ABC\$*\d+\$!@

Match: 
ABC$$$$1$!@
ABC$$$12$!@
ABC$$123$!@
ABC$1234$!@
ABC12345$!@

No Match:
ABC$$123456789$!@
ABC1$2$34$!@

Regex101

我的尝试:

ABC(?=.{5})\$*\d+\$!@

这不起作用,因为由于\d+,它仍然匹配到下一个数字。我尝试的另一件事是

ABC(?=[\$\d]{5}[^\$\d])(\$*\d+)\$!@

它的目的是在遇到非数字或非 $ 时停止查找,但这没有帮助,因为字符串的下一部分可以以 $ 或数字开头。

解决这个问题的最简单的正则表达式:

(\$\$\$\$\d|\$\$\$\d\d|\$\$\d\d\d|\$\d\d\d\d|\d\d\d\d\d)

但我试图使这个更通用,并且可以有可变数量的填充 E.G.

$$$$$$$$$1
$$$$$$$$12
...

【问题讨论】:

  • 你的意思是完成 variable-data 根本不会以数字开头?
  • @revo 我不确定任何 在运行前会是什么。它们都是用户定义的。它们肯定是数字。
  • 那么这样的输入字符串 ABC$$$$11!@ 的可能性存在并且应该匹配?
  • 是的,很遗憾。我试图用括号本身的句点和“d”来传达这一点。
  • 那你为什么说ABC$$123456789$!@不匹配。根据您的要求,它应该匹配。

标签: javascript regex


【解决方案1】:

您可以提前检查在接下来的 5 个字符范围内是否没有填充字符和数字的倒序,然后要求并捕获 5 个仅是数字和填充字符的字符:

    ABC(?!.{0,3}\d\$)([\$\d]{5})\$!@

如果你需要至少一位数字,那么:

    ABC(?!.{0,3}\d\$)([\$\d]{4}\d)\$!@

【讨论】:

    【解决方案2】:
    ABC(?=.{5}\$!@)\$*\d+\$!@
    

    这与您的第一次尝试非常相似,但略有不同的是,前瞻还包含终止字符串。这给了它一些锚定的东西,以确保正则表达式不再匹配任何东西。

    【讨论】:

    • 谢谢,不过我想要一些不依赖于下一个令牌的东西。这似乎确实回答了我最初的问题。
    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多