2013-04-23 102 views
0

我想写一个正则表达式,但它太贪婪了。输入字符串的形式可以是以下格式:正则表达式太贪婪

STUFF_12_1234 or STUFF_1234 

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

_(.*?)\Z 

这可以通过返回“1234”工程“STUFF_1234”但是当我用它对付“STUFF_12_1234”返回“12_1234”

任何建议的表达应该如何改变以解决这个问题?

+2

您可以通过'_'分割字符串,并选择最后一个项目。 – nhahtdh 2013-04-23 11:30:20

回答

1

至少有3种方式来抢占近下划线_后出现的文字:

  • 保留当前正则表达式,但是指定RightToLeftRegexOptions。由于正则表达式是从右到左搜索的,所以惰性量词将尽可能少地匹配字符串中最后一个_之后的字符。通过_

    _([^_]*)\Z 
    
  • 拆分输入字符串,并选择最后一项:

  • 修改正则表达式来禁止下划线_在要匹配的文本。对于此String.Split已足够,不需要Regex.Split

+0

一些很好的答案,但这是最全面的,给出三种不同的选择。我几乎得到正确的表达,但决定张贴在这里,去吃午饭。感谢所有的投入。 – Retrocoder 2013-04-23 12:59:48

0

从有效字符列表中排除_

_([^_]*)\Z 
0

无论早期还是晚期停止使用正则表达式

_([^_]*)\Z 

按正规表达式搜索左到右,让贪婪控制。但它不会改变比赛左端的位置。

0

两个选项。

  1. 用正则表达式:

    _([^_]*?) 
    

    你只需要没有选择_字符或

    _(\d*?) 
    

    如果你知道的字符是数字(\d

  2. 随着子串:

    yourString.Substring(yourString.LastIndexOf('_')+1) 
    
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