正则表达式 - 以某个模式开头但不以另一个模式结尾

4

如何使用正则表达式检查字符串是否以特定模式开头,但不以特定模式结尾。

示例:

Must StartsWith: "US.INR.USD.CONV"
Should not end with: ".VALUE"

Passes Regex: "US.INR.USD.CONV.ABC.DEF.FACTOR"
Fails Regex Check: "US.INR.USD.CONV.ABC.DEF.VALUE"

我正在使用C#。

3个回答

8
您可以使用基于负向先行断言的正则表达式来实现此功能:
^US\.INR\.USD\.CONV(?!.*?\.VALUE$).*$

正则表达式演示

解释:

  • ^US\.INR\.USD\.CONV - 匹配以 US.INR.USD.CONV 开头的输入
  • (?!.*?\.VALUE$) - 负向先行断言,确保该行不以 .value 结尾

谢谢。我不知道正则表达式可以做这样的事情。如果我想添加“或”条件,比如不以VALUE或PERCENT结尾,这是否可能? - Cannon
1
@buffer_overflow 是的,只需添加 (?!.*?\.(?:VALUE|PERCENT)$) - vks
1
我认为你应该在value前面加上转义符号,这样它就只会寻找一个字面上的.VALUE,也就是任何字符之前的"VALUE",对吧? - 1252748

4
^US\.INR\.USD\.CONV.*(?<!\.VALUE)$

尝试这个。查看演示。
只需使用负回顾后断言,确保“.VALUE”不在“$”或字符串结尾之前。
请参考以下链接:https://regex101.com/r/fA6wE2/26
(?<!\.VALUE)$ ==>Makes sure regex engine looks behind and checks if `.VALUE` is not there when it reaches the end of string.

注意:对于看到这个线程的人们,JavaScript 显然不支持后顾语法,因此在 JS 中无法使用此方法。(但在 .NET 中可以) - John M. Wright

2

你不需要正则表达式。你可以使用String.StartsWithString.EndsWith

if(val.StartsWith("US.INR.USD.CONV") && !val.EndsWith(".VALUE"))
{
    // valid 
}

正如您在对anubhava答案的评论中提到的,您也可以通过检查结尾是否为".PERCENT"来实现此操作。

if(val.StartsWith("US.INR.USD.CONV") && 
  !val.EndsWith(".VALUE") &&
  !val.EndsWith(".PERCENT"))
{
    // valid 
}

在我看来,这使得代码更易读,并且几乎肯定会执行得更快。


这看起来很容易和自然。 - vks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接