Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式-接受AZ,不包括固定长度的一些字母_Regex_Regex Negation - Fatal编程技术网

Regex 正则表达式-接受AZ,不包括固定长度的一些字母

Regex 正则表达式-接受AZ,不包括固定长度的一些字母,regex,regex-negation,Regex,Regex Negation,我找不到如何从字符串的固定长度部分排除一些字符 使用^XXX-\d{4}-(?![XYT])[A-Z]{4}$ 我可以从最后一个字符串的第一个字符中排除XYT,因此 XXX-0000-AAAA is ok XXX-0000-XAAA is not ok 我的问题是,我不希望最后一段的任何部分出现X、Y或T XXX-0000-AAXA is not ok XXX-0000-ABXX is not ok XXX-0000-ABCT is not ok and so on 我该怎么做 更准确地说,

我找不到如何从字符串的固定长度部分排除一些字符

使用
^XXX-\d{4}-(?![XYT])[A-Z]{4}$
我可以从最后一个字符串的第一个字符中排除
XYT
,因此

XXX-0000-AAAA is ok
XXX-0000-XAAA is not ok
我的问题是,我不希望最后一段的任何部分出现
X
Y
T

XXX-0000-AAXA is not ok
XXX-0000-ABXX is not ok
XXX-0000-ABCT is not ok
and so on
我该怎么做


更准确地说,我补充说XYT是变量,所以固定列表的解决方案是可行的,但并不方便

为什么不在最后一部分使用
[a-SU-WZ]{4}
?也就是说,首先只匹配你想要的字母

或者,让前面的部分重复:
(?:(?![XYT])[A-Z]){4}

有两种“优雅”的方法。最简单的理解是:

^XXX-\d{4}-((?![XYT])[A-Z]){4}$
这非常接近于你所拥有的,但是相反地,对重复中的每个角色都应用了消极的前瞻

另一种方法是使用字符类减法:


您很少看到使用这种语法,因此如果没有其他东西可以给您的同事留下深刻印象,那么最好使用这种语法。

Regex:
XXX-\d{4}-(?!.[XYT])[A-Z]{4}

1.
XXX-\d{4}
这将匹配
XXX-
,然后匹配
四位数字

2.
(?!.[XYT])
X
Y
T

3.
[A-Z]{4}
匹配可以包括
A-Z
4
字符

这里有一个多功能、快速的替代方案 TLDR
^XXX-[0-9]{4}-[^XYT-@[-²]{4}$

此线程上的问题突出了以几乎需要“布尔”方式来表示字符类的方式使用正则表达式时的一个挑战,例如['a-Z',而不是[/strong>'XYZ']为了其他面临与OP描述的类似场景的人的利益

由于缺乏对诸如['a-Z'但不支持'XYZ']等语法的直接支持,实现此类逻辑并控制正则表达式中重叠表达式的优先顺序的唯一方法是使用以下功能:

然而,正如这里的另一个答案所指出的,低效地应用它们可能会付出极大的代价

以下是应用程序的性能标准的巨大差异导致不可能有一个通用正则表达式来实现这一点的一些方法

  • 在速度差异不明显的情况下,单字符串匹配的性能可能需要更可靠的正则表达式。这可能是代码中可移植性的情况(即几乎每个正则表达式解析器都知道
    [[-\`a-~!-@]
    意味着什么,但有些人不知道
    \W
    [:punt:][/code>的意思
  • 在规模的另一端,纳秒是至关重要的,那么人们可能希望在赶上正则表达式之前重新评估该过程的许多其他部分,但在任何情况下,非常不灵活的高性能的正则表达式可能是首选,在这里,如果系统不是alr,则可以使其兼容伊迪
  • 字符串的种类对性能有很大影响,因此根据应用程序的不同,可以对字符串的某些部分进行不同的评估
  • 出于同样的原因,应该根据用例来决定如何构造环顾
  • 如果字符串是数据库的一部分,并且通过API或其他内置函数进行搜索,则可能需要使用特定的语法或格式
  • 除了匹配表达式外,不同的正则表达式库、函数和扩展可以使用选项改变正则表达式的整个执行方式。例如,python
    re.findall()
    可以用作具有未知重复长度的正向后视的操作等价物
  • 一些实现正则表达式的程序只是比其他程序快得多。在比较理论步骤时,这足以抵消效率差异
以下是一个平衡的方法来解决这个问题: 下面是一个示例,其中10000个字符串匹配了10100个字符串:

下面是一个示例,其中100个字符串匹配了10100个字符串:


在10000个字符串的情况下,这两个正则表达式的性能差别不大,相反,这个正则表达式:
^XXX-[0-9]{4}-([a-Z](?好的,这似乎是我能创建的最有效、最正确的模式:()

我已经设置了一组字符串来匹配,这些字符串应该/确实会暴露此页面上发布的模式中的任何缺陷。我的模式用176个步骤完成测试,并提供正确的匹配。这使得它成为按照OP的要求使用负前瞻的最佳模式

对于苹果对苹果的比较:

原始190个步骤
^XXX-\d{4}-(?![XYT])[A-Z]{4}$
user1875921

不正确的300步
XXX-\d{4}-(?!.[XYT])[A-Z]{4}
Sahil-Gulati

更正140个步骤
^XXX-\d{4}-[ABCDEFGHIJKLMNOPQRSUVWZ]{4}$
[注释]

纠正245个步骤
^XXX-\d{4}-((?![XYT])[A-Z]){4}$
Bohemian#1

纠正279个步骤
^XXX-\d{4}-(?:(?![XYT])[A-Z]){4}$
melpomene

n/a-
^XXX-\d{4}-[a-Z&[^XYT]]{4}$
Bohemian#2


您好,是的,您是对的,在这种情况下,这是一种更简单的方法。问题是,我有几个其他标签,其中排除的字母不相同。因此我希望找到一种方法,只列出这些字母+AZ,这样更容易阅读/check@user1875921已编辑。@user1875921如果黑名单中的字符
^XXX-\d{4}-[A-Z&&[^XYT]]{4}$
^XXX-[0-9]{4}-[^XYT -@[-²]{4}$
XXX-0000-SNUR XXX-0000-FHDZ XXX-0000-+439 XXX-0000-04X9 XXX-0000-/1Y+ XXX-0000-X/X9 XXX-0000-Y6X9 XXX-0000-XY16 XXX-0000-0T94 XXX-0000-++6Y XXX-0000-TT+3 XXX-0000-NLNL XXX-0000-QPSE exclude="XYT" egrep "^XXX-[0-9]{4}-([^$exclude[^XYT -@[-²]){4}$" < stringfile XXX-0000-SNUR XXX-0000-FHDZ XXX-0000-NLNL XXX-0000-QPSE
exclude="XYT"
customCharClass="$(
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZ
echo "${alpha[@]}" \
| sed -E -e "s/[$exclude]//g")"

egrep "^XXX-[0-9]{4}-([$customCharClass]){4}$" < stringfile
^XXX-[0-9]{4}-([ABCDEFGHIJKLMNOPQRSUVWZ]){4}$ 
^X{3}-\d{4}-(?![A-Z]{0,3}[XYT])[A-Z]{4}$
^X{3}-\d{4}-(?![A-Z]{0,3}[XYT])[A-Z]{4}$