Regex 合并两个正则表达式

Regex 合并两个正则表达式,regex,Regex,我很难合并两个正则表达式 因为我对它不太熟悉,所以我单独编写了正则表达式: 1) 字母不能超过一行两次,也允许使用“'”和“-”符号: ^(?!.*([A-Za-z])\1{2})[-'A-Za-z]{3,50}$ 2) 一行中不能有两个允许的符号: ^(?!.*([A-Za-z])\1{2})[-'A-Za-z]{3,50}$ 它解决了“-”和“-”的问题,但仍然需要考虑一种方法来疏远“-”或“-” 我正在尝试将它们合并为一个,如下所示: ^(?!.*([A-Za-z])\1{2}|([-

我很难合并两个正则表达式

因为我对它不太熟悉,所以我单独编写了正则表达式:

1) 字母不能超过一行两次,也允许使用“'”和“-”符号:

^(?!.*([A-Za-z])\1{2})[-'A-Za-z]{3,50}$
2) 一行中不能有两个允许的符号:

^(?!.*([A-Za-z])\1{2})[-'A-Za-z]{3,50}$
它解决了“-”和“-”的问题,但仍然需要考虑一种方法来疏远“-”或“-”

我正在尝试将它们合并为一个,如下所示:

^(?!.*([A-Za-z])\1{2}|([-'])(?!\2))[-'A-Za-z]{3,50}$
但我的手好像断了。请告诉我我的错误在哪里

我想要达到的目标:

1) 一行中不超过两个相同的字母

通过:
Test
Teest

失败:
teest
tttest

2) 一行中不超过1个特殊符号(只允许有两个“-”和“-”)

通过:
Te-st
Te-t
测试
测试
测试
测试
t-e-s-t

未通过:
Te--st
tes't
-'test
'-test
测试-

3) 最小值为3个字母(特殊符号不计算),最大值为50个符号(特殊符号计算)

通过:
Te-s-t
tes't
-test
'test
test-
test'

未通过:
te-
-te
t-e
't'
您可以使用

^(?!.*([A-Za-z])\1{2})(?=(?:[^a-zA-Z]*[a-zA-Z]){3,})(?!.{51})[-']?[A-Za-z]+(?:[-'][A-Za-z]+)*[-']?$
请参阅(带
\n
[^a-zA-Z]
字符类,仅用于演示目的)

解释如下:

  • ^
    -字符串的开头
  • (?!*([A-Za-z])\1{2}
    -一行中不允许有3个相同的字母
  • (?=(?:[^a-zA-Z]*[a-zA-Z]){3,})
    -至少需要3个字母(连续和非连续)
  • (?!.{51})
    -字符串长度不能超过50个符号

    零宽度检查结束,现在使用以下字符:
  • [-']?
    -字符串开头的一个或零个
    -
    '
  • [A-Za-z]+
    -1个或多个字母
  • (?:[-'][A-Za-z]+)*
    -0或更多序列:
    • [-']
      -a
      '
      -
    • [A-Za-z]+
      -1+个字母(这实际上不允许连续的
      -
      '
  • [-']?
    -字符串末尾的一个或零个
    -
    '
  • $
    -字符串结尾
您可以使用

^(?!.*([A-Za-z])\1{2})(?=(?:[^a-zA-Z]*[a-zA-Z]){3,})(?!.{51})[-']?[A-Za-z]+(?:[-'][A-Za-z]+)*[-']?$
请参阅(带
\n
[^a-zA-Z]
字符类,仅用于演示目的)

解释如下:

  • ^
    -字符串的开头
  • (?!*([A-Za-z])\1{2}
    -一行中不允许有3个相同的字母
  • (?=(?:[^a-zA-Z]*[a-zA-Z]){3,})
    -至少需要3个字母(连续和非连续)
  • (?!.{51})
    -字符串长度不能超过50个符号

    零宽度检查结束,现在使用以下字符:
  • [-']?
    -字符串开头的一个或零个
    -
    '
  • [A-Za-z]+
    -1个或多个字母
  • (?:[-'][A-Za-z]+)*
    -0或更多序列:
    • [-']
      -a
      '
      -
    • [A-Za-z]+
      -1+个字母(这实际上不允许连续的
      -
      '
  • [-']?
    -字符串末尾的一个或零个
    -
    '
  • $
    -字符串结尾

您的意思是三个连续的字母不能出现在一行中,并且每个
'
-
应该用字母包围?试试
^(?。*([A-Za-z])\1{2}(?=.{3,50}$)[A-Za-z]+(?:[-'][A-Za-z]+)*$
。没有测试用例,很难检查模式是否是您所需要的。@WiktorStribiżew我已经用测试用例更新了我的问题。测试用例1)和2)似乎是相同的。(您在规则中再次使用相同的编号,但我指的是顶部附近的正则表达式。)您的意思是三个连续的字母不能出现在一行中,并且每个
'
-
应该用字母包围?试试
^(?。*([A-Za-z])\1{2}(?=.{3,50}$)[A-Za-z]+(?:[-'][A-Za-z]+)*$
。没有测试用例,很难检查模式是否是您所需要的。@WiktorStribiżew我已经用测试用例更新了我的问题。测试用例1)和2)似乎是相同的。(在规则中再次使用相同的编号,但我指的是顶部附近的正则表达式。)