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]).*
字符串的开头^
非捕获组(?:
匹配字符a-zA-Z,不带[abce-zABCE-Z][a-Z]
和d
,后跟小写字符a-Zd
或|
匹配字符a-zA-Z,后跟小写字符a-Z,不带[a-zA-Z][a-df-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