正则表达式过于贪婪

时间:2013-04-23 11:28:05

标签: regex c#-4.0

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

STUFF_12_1234 or STUFF_1234

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

_(.*?)\Z

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

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

5 个答案:

答案 0 :(得分:1)

至少有3种方法可以抓取最后一个下划线_后出现的文字:

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

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

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

答案 1 :(得分:0)

从有效字符列表中排除_

_([^_]*)\Z

答案 2 :(得分:0)

使用正则表达式

_([^_]*)\Z

正则表达式从左向右搜索,因此贪婪控制着他们是提前还是迟到。但它不会改变比赛左端的位置。

答案 3 :(得分:0)

两个选项。

  1. 使用正则表达式:

    _([^_]*?)
    

    您只需选择_字符或

    即可
    _(\d*?)
    

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

  2. 使用子字符串:

    yourString.Substring(yourString.LastIndexOf('_')+1)
    

答案 4 :(得分: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