我的RegExp非常生疏!我有两个问题,与以下RegExp相关
问题第1部分
我正在努力让以下RegExp工作
^.*\d{1}\.{1}\d{1}[A-Z]{5}.*$
我要传递的是x1.1SMITHx
或x1.1.JONESx
x
可以是任何长度的任何内容,但输入字符串的SMITH
或JONES
部分会检查5个大写字符仅
所以:
some preamble 1.1SMITH some more characters 123
xyz1.1JONES some more characters 123
都传递
但是
another bit of string1.1SMITHABC some more characters 123
xyz1.1ME some more characters 123
不应该通过,因为SMITH
现在包含3个额外字符ABC
,而ME
只有2个字符。
我只在1.1之后才通过,只有5个字符
问题第2部分
如何匹配特定的位数? 没有打扰他们是什么,这是我无法工作的人数
如果我使用^\d{1}$
我认为只有一个数字存在才会通过
它将通过5
但它也会通过67
它应该失败67
,因为它的长度是两位数。
只有存在1位数时,RegExp才会通过。
答案 0 :(得分:0)
对于第一个,请查看此正则表达式:
^.*\d\.\d[A-Z]{5}[^A-Z]*$
在解决问题之前,通过删除所有{1}
,我更容易阅读。这是一个不必要的限定符,因为正则表达式默认会查找一个字符(/abc/
匹配abc
而不是aaabbbccc
。)
要解决此问题,我们只需要替换您的最终.*
。这表示匹配0+字符的任何东西。如果我们做这个" dot-match-all"更具体(即[^A-Z]
),您不会与SMITHABC
匹配。
答案 1 :(得分:0)
我想出了一些解决方案,但我最喜欢这些。如果您的RegEx引擎支持负前瞻和负后瞻,您可以使用:
Part 1: (?<![A-Z])[A-Z]{5}(?![A-Z])
Part 2: (?<!\d)\d(?!\d)
两者都有(?<!expr)expr(?!expr)
的模式。
(?<!...)
是一个负面的后瞻,意味着匹配前面没有括号中的表达式。(?!...)
是一个否定的预测,这意味着该括号中的表达式后面没有匹配。所以:对于第一个模式,它意味着“找到5个大写字符,既不是前面的也不是后面跟着另一个大写字符”。换句话说,恰好匹配5个大写字符。
第二种模式的工作方式相同:找一个不在其他数字之前或之后的数字。
您可以在Regex 101上尝试。