我正在尝试匹配一个字符串,该字符串不允许同时使用相同的特殊字符
我的正则表达式是:
[RegularExpression(@"^+[a-zA-Z0-9]+[a-zA-Z0-9.&' '-]+[a-zA-Z0-9]$")]
这解决了我的所有要求,除了以下两个问题
这是我的字符串:第一个月
可接受:
bra-cks, b-r-a-c-ks, b.r.a.c.ks, bra cks (by the way above regular expression solved this)
不可接受:
issue 1: b.. or bra..cks, b..racks, bra...cks (two or more any special character together),
issue 2: bra cks (two ore more white space together)
3条答案
按热度按时间xt0899hw1#
可以使用负向前查找使包含两个连续特殊字符的字符串无效:
演示:https://regex101.com/r/7j14bu/1
prdp8dxp2#
根据您的描述和模式,您试图匹配以字母数字开头和结尾的文本(由于原始模式中的
^+[a-zA-Z0-9]
和[a-zA-Z0-9]$
),并且在文本内部,您不希望有任何两个连续(相邻)的特殊字符,再次从正则表达式中猜测,这两个字符是.
&
``'
-
"什么是错的"
^+
-我认为这里您希望确保匹配从行/字符串的开头开始,因此这里不需要+
[a-zA-Z0-9.&' '-]
-在这个字符类中,您将'
加倍,这是完全不必要的请尝试模式
图案说明
^
-定位点,匹配字符串的开头[a-zA-Z0-9]
-字符类,匹配[]
中的一个字符(?:...)
-非捕获组(?!...)
-负前瞻[.& '-]{2,}
-匹配字符类中的2个或多个字符[a-zA-Z0-9.& '-]
-字符类,匹配[]
中的一个字符*
-匹配零个或多个与前面的模式匹配的文本$
-定位点,匹配字符串的结尾Regex demo
kiz8lqtg3#
关于当前正则表达式的一些说明:
+
量词放在了要量化的模式的 * 之前 *,而不是 * 之后 *。例如,^+
没有多大意义,因为^
只是输入的开始,大多数正则表达式引擎甚至不允许这样做。[a-zA-Z0-9.&' '-]+
不区分字母数字字符和其他字符,而您希望它们的规则不同,特别是对于其他字符,您不希望它们重复,因此+
不适合这些字符。'
)。也许你想用某种方式来分隔空格,但是意识到那些引号是 * 字面上 * 解释的。所以也许你应该删除它们。或者如果你打算允许一个引号,只列出它一次。下面是一个更正(如果您仍然需要,请添加报价):
随访
根据一条评论,我怀疑你会允许一个非字母数字字符被一个空格包围,即使这会给出一个多个非字母数字字符的序列。在这种情况下,使用下面的代码:
所以这里的空间扮演了不同的角色:它可以有选择地出现在分隔符(“.&-”之一)的前后,也可以单独出现。空格周围的括号是不需要的,但我用它们来强调空格是 * 有意的 * 而不是打字错误。