C# 定位;列夫;串连

C# 定位;列夫;串连,c#,regex,C#,Regex,如果“LEV”存在,我想做一个验证。“V”是字符串中的最后一个字母 我正在寻找一个与此匹配的正则表达式: WATER LEV answer: true TTM DAB LEV answer: true FOODS IN2 LEV answer: true RLA LEV answer: true dd LEVFF answer: false RLA LEV answer: false due to white space after "V" 这是我尝试过的,但没有成功: LE*

如果“LEV”存在,我想做一个验证。“V”是字符串中的最后一个字母

我正在寻找一个与此匹配的正则表达式:

WATER LEV
answer: true

TTM DAB LEV
answer: true

FOODS IN2 LEV
answer: true

RLA LEV
answer: true

dd LEVFF
answer: false

RLA LEV 
answer: false due to white space after "V"

这是我尝试过的,但没有成功:

 LE*\D[V]
你可以试试这个:

LEV$
末尾的
$
表示字符串的
结尾

如果要在字符串末尾匹配整个单词
LEV
,请在其前面加一个
\b
,这意味着
单词边界

\bLEV$

让我澄清一下为什么
\bLEV$
不是一个好答案

$
锚点匹配字符串的结尾,或匹配字符串中最后一个
\n
字符之前的位置。见:

$
-匹配必须出现在字符串的末尾或行或字符串的末尾
\n
之前

因此,要匹配字符串的最末端,必须使用
\z
锚定

下一点是匹配应该出现在字符串的末尾,但是默认情况下,正则表达式引擎从左到右搜索匹配。要大大增强匹配,只需使用
RegexOptions.RightToLeft
修饰符来反转字符串分析

因此,使用

var rx = new Regex(@"\bLEV\z", RegexOptions.RightToLeft);
以有效的方式在字符串的最末端查找整个单词
LEV

但是,在大多数情况下,当您不需要检查子字符串是否是一个完整的单词时,您可以使用
String.EndsWith()

另外,请注意您的
LE*\D[V]
匹配:

  • L
    -字符串中任何位置的文本
    L
    ,后跟
  • E*
    -0+
    E
    字符后跟
  • \D
    -非数字字符(必需!),后跟
  • [V]
    -一个
    V
    字符

因此,根据这种模式,
L^V
是有效的匹配。

因此,
LE
可以在任何地方,并且
V
位于末尾?模式中的
*\D
非常容易引起误解。为什么不干脆
yourString.EndsWith(“LEV”)?正则表达式在这方面似乎有些过分。这不是一个非常明确的问题,但我想
LE*\D[V]
是您的尝试。然而,这意味着
E
可以重复,并且在最后一个
E
V
之间必须有另一个字符-非数字。是哪一个?为了匹配您描述的
LEV\s*$
应该做到这一点。Wiktor Stribiżew-在本文中,只有单词“LEV”而不是“LEV”。。。V@juharr正如我所说,这不是一个非常明确的问题。我把它解释为问题的开始——它应该返回真值。但是,我不确定。这不能处理尾随的空白。使用
LEV\s*$
。他不需要尾随空格。参见他示例列表中的最后一个。V是字符串中的最后一个字母。请看我上面的评论。是的,
$
表示字符串的结尾,但不是字符串的结尾。@WiktorStribiżew-Huh…?默认情况下,在C#中,在不更改选项的情况下,
$
只匹配字符串的结尾,而不是新行。参见参考资料。@Rawling,你错了,参见。如果您不相信我或官方参考,请参阅演示。我什么都没想出来
Regex.IsMatch(“Some LEV\n”、“LEV$”)
将返回
true
。它实际上是一个非常奇怪的东西,它的根源是Perl正则表达式。我不知道他们为什么决定.NET flavor应该继承这种行为。谢谢你的启发。这会让我生气的:D
if (s.EndsWith("LEV")) {...}