Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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-如何防止任何以“开始”的字符串;";但不能使用“向前看”或“向后看”?_Regex - Fatal编程技术网

Regex-如何防止任何以“开始”的字符串;";但不能使用“向前看”或“向后看”?

Regex-如何防止任何以“开始”的字符串;";但不能使用“向前看”或“向后看”?,regex,Regex,我有一个正则表达式 [a-zA-Z][a-Z] 我必须更改此正则表达式,使正则表达式不接受以“de”、“de”、“de”和“de”开头的字符串。我不能使用“向后看”或“向前看”,因为我的系统不支持它?只需忽略这些字符: [a-ce-z][a-df-z][a-gi-kwxyzWZXZ] 确保该标志设置为不区分大小写。此外,[a-gi-kwxyzWZXZ]也可以修改为[a-gi-kwxyz] 编辑: 正如评论中指出的,这里的正则表达式不支持以d开头但后面不跟e的其他单词。在这种情况下,负前瞻是一种可

我有一个正则表达式

[a-zA-Z][a-Z]


我必须更改此正则表达式,使正则表达式不接受以“de”、“de”、“de”和“de”开头的字符串。我不能使用“向后看”或“向前看”,因为我的系统不支持它?

只需忽略这些字符:

[a-ce-z][a-df-z][a-gi-kwxyzWZXZ]

确保该标志设置为不区分大小写。此外,
[a-gi-kwxyzWZXZ]
也可以修改为
[a-gi-kwxyz]

编辑:

正如评论中指出的,这里的正则表达式不支持以
d
开头但后面不跟
e
的其他单词。在这种情况下,负前瞻是一种可能的解决方案:


^(?!de)[a-z]+
有一种解决方案没有前瞻或落后,但您需要能够使用组

这里的想法是创造一种“蜜罐”,与你的负面结果相匹配,只保留你感兴趣的结果

在你的情况下,这会写:

[dD][eE].|()

如果命题是
de
(此处不区分大小写),它将匹配,但组(1)将是
null

另一方面,例如,匹配的diZ将与or之前的diZ不匹配,因此将属于
组(1)

最后,如果命题不是以de开头,并且与您的正则表达式不匹配,那么就根本没有组可供获取

如果您需要确保您的命题将匹配所提供的整个字符串,您可以通过以下方式更新正则表达式:

^(?[dD][eE].|())$

请注意,
?:
不是任何类型的前瞻,它用于将组标记为非捕获,这样
仍将被
组(1)
捕获(否则将成为
组(2)
,并且从性能角度看,组的捕获并不总是透明的操作).

这匹配任何不以“DE”开头的内容(不区分大小写,不带环顾,允许前导空格):

^*+(?:[^Dd]。|[^Ee])


用于空格的所有格量词
*+
阻止
[^Dd]
通过回溯来匹配空格,从而使该正则表达式与前导空格相匹配。

您可以使用替代,但不匹配第一个字符中的
d
d
,或排除将
e
作为第二个字符进行匹配

请注意,模式
[a-zA-Z][a-Z]
至少匹配2个字符,以下模式也将匹配:

^(?:[abce-zABCE-Z][a-z]|[a-zA-Z][a-df-z]).*
  • ^
    字符串的开头
  • (?:
    非捕获组
    • [abce-zABCE-Z][a-Z]
      匹配字符a-zA-Z,不带
      d
      d
      ,后跟小写字符a-Z
    • |
    • [a-zA-Z][a-df-Z]
      匹配字符a-zA-Z,后跟小写字符a-Z,不带
      e
  • 关闭非捕获组
  • *
    匹配0+乘以除换行符以外的任何字符

另一种选择是使用单词边界
\b
而不是锚定
^

\b(?:[abce-zABCE-Z][a-z]|[a-zA-Z][a-df-z])[a-zA-Z]*\b

这主意不错,但这些都没有考虑到去甲基化,因为它以D开头,虽然开头不是DE。
[a-gi-kwxyzWZXZ]
[a-gi-kwxyz]|i
不同。可能是OP要求只有WXYZ可以是大写?如果标志为off,则它们是same@CinCout有没有办法在不改变现有正则表达式的情况下解决这个问题?@Codemaster你是什么意思?如果正则表达式不能满足您的需求,那么唯一能让它工作的方法就是修改它。对其余输入的约束是什么?你能提供样本输入吗?确实和不匹配。我看到你更新了正则表达式,同意@ CcExt:对我来说,用例不敏感的标志比每次都保持这两个案例更容易。如果你在代码中使用这个,我会考虑在这个简单的情况下使用没有正则表达式的方法。性能可能会提高。@Alex是的,通过代码会容易得多,但有一些限制,因为系统是遗留的,我不允许接触代码,只允许更改regext。这也会接受字符串,如“demand”(以一个或多个空格开头)你可以编辑你的答案,以帮助OP了解他们如何将其与现有正则表达式结合使用,因为这可能不是每个人都能看到的。此外,小组也可以成为非成员-capturing@CinCout两个反馈都合并了。谢谢。@Chop OP对整个输入的要求并不明显,也与问题无关,但这就是你的想法吗?如果没有,请随意编辑我的答案。
\b(?:[abce-zABCE-Z][a-z]|[a-zA-Z][a-df-z])[a-zA-Z]*\b