regex 如何使用正则表达式匹配字符串,正则表达式不允许同时使用相同的特殊字符?

iyfjxgzm  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(241)

我正在尝试匹配一个字符串,该字符串不允许同时使用相同的特殊字符
我的正则表达式是:

[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)
xt0899hw

xt0899hw1#

可以使用负向前查找使包含两个连续特殊字符的字符串无效:

^(?!.*[.&' -]{2})[a-zA-Z0-9.&' -]+$

演示:https://regex101.com/r/7j14bu/1

prdp8dxp

prdp8dxp2#

    • 目标**

根据您的描述和模式,您试图匹配以字母数字开头和结尾的文本(由于原始模式中的^+[a-zA-Z0-9][a-zA-Z0-9]$),并且在文本内部,您不希望有任何两个连续(相邻)的特殊字符,再次从正则表达式中猜测,这两个字符是.& `` '-
"什么是错的"
^+-我认为这里您希望确保匹配从行/字符串的开头开始,因此这里不需要+
[a-zA-Z0-9.&' '-]-在这个字符类中,您将'加倍,这是完全不必要的

    • 解决方案**

请尝试模式

^[a-zA-Z0-9](?:(?![.& '-]{2,})[a-zA-Z0-9.& '-])*[a-zA-Z0-9]$

图案说明
^-定位点,匹配字符串的开头
[a-zA-Z0-9]-字符类,匹配[]中的一个字符
(?:...)-非捕获组
(?!...)-负前瞻
[.& '-]{2,}-匹配字符类中的2个或多个字符
[a-zA-Z0-9.& '-]-字符类,匹配[]中的一个字符
*-匹配零个或多个与前面的模式匹配的文本
$-定位点,匹配字符串的结尾
Regex demo

kiz8lqtg

kiz8lqtg3#

关于当前正则表达式的一些说明:

  • 看起来您将+量词放在了要量化的模式的 * 之前 *,而不是 * 之后 *。例如,^+没有多大意义,因为^只是输入的开始,大多数正则表达式引擎甚至不允许这样做。
  • 模式[a-zA-Z0-9.&' '-]+不区分字母数字字符和其他字符,而您希望它们的规则不同,特别是对于其他字符,您不希望它们重复,因此+不适合这些字符。
  • 在一个字符类中,重复相同的字符是没有意义的,就像你重复了一个引号(')。也许你想用某种方式来分隔空格,但是意识到那些引号是 * 字面上 * 解释的。所以也许你应该删除它们。或者如果你打算允许一个引号,只列出它一次。

下面是一个更正(如果您仍然需要,请添加报价):

^[a-zA-Z0-9]+(?:[.& -][a-zA-Z0-9]+)*$

随访

根据一条评论,我怀疑你会允许一个非字母数字字符被一个空格包围,即使这会给出一个多个非字母数字字符的序列。在这种情况下,使用下面的代码:

^[a-zA-Z0-9]+(?:(?:[ ]|[ ]?[.&-][ ]?)[a-zA-Z0-9]+)*$

所以这里的空间扮演了不同的角色:它可以有选择地出现在分隔符(“.&-”之一)的前后,也可以单独出现。空格周围的括号是不需要的,但我用它们来强调空格是 * 有意的 * 而不是打字错误。

相关问题