0

我正在尝试编写一个正则表达式,但它太贪婪了。输入字符串可以是以下任一格式:

STUFF_12_1234 or STUFF_1234

我想要做的是创建一个正则表达式来抓取最后一个_. 所以在上面的例子中,这将是数字“1234”。最后一个之后的字符数_会有所不同,它们可能是字母和数字的组合。我尝试了以下表达式:

_(.*?)\Z

这适用于“STUFF_1234”,返回“1234”,但是当我对“STUFF_12_1234”使用它时,它返回“12_1234”</p>

任何人都建议如何更改表达式以解决此问题?

4

5 回答 5

2

至少有 3 种方法可以获取出现在最后一个下划线之后的文本_

  • 保留当前的正则表达式,但指定. 由于正则表达式是从右到左搜索的,因此惰性量词将匹配尽可能少的字符,直到字符串中最后一个字符之后。RightToLeft RegexOptions_

  • _修改正则表达式以在要匹配的文本中禁止下划线:

    _([^_]*)\Z
    
  • 拆分输入字符串_并选择最后一项。因为这就String.Split足够了,不需要Regex.Split.

于 2013-04-23T11:34:55.093 回答
0

_从有效字符列表中排除:

_([^_]*)\Z
于 2013-04-23T11:31:03.757 回答
0

使用正则表达式

_([^_]*)\Z

正则表达式从左到右搜索,所以贪心控制它们是早停还是晚停。但它不会改变匹配左端的位置。

于 2013-04-23T11:35:21.247 回答
0

两种选择。

  1. 使用正则表达式:

    _([^_]*?)
    

    您只需要选择_字符或

    _(\d*?)
    

    如果您知道字符是数字 ( \d)

  2. 带子字符串:

    yourString.Substring(yourString.LastIndexOf('_')+1)
    
于 2013-04-23T11:38:13.080 回答
0

试试这个:

String s_YourString="STUFF_12_34";
String s_OP = Regex.Match(s_YourString, "_[^_.]+$").Value.Trim('_');//Output:34            
s_YourString="STUFF_1234";
s_OP = Regex.Match(s_YourString, "_[^_.]+$").Value.Trim('_');   //Output:1234
于 2013-04-23T12:00:26.213 回答