我正在尝试写一个正则表达式,但它太贪心了。输入字符串可以采用以下任一格式:
STUFF_12_1234 or STUFF_1234
我想要做的是创建一个正则表达式来抓取最后_
之后的字符。所以在上面的例子中,数字是“1234”。此最后_
之后的字符数会有所不同,它们可能是字母和数字的组合。我尝试过以下表达式:
_(.*?)\Z
这适用于“STUFF_1234”,返回“1234”,但当我对“STUFF_12_1234”使用时,它返回“12_1234”
有人建议如何更改表达式以解决此问题吗?
答案 0 :(得分:1)
至少有3种方法可以抓取最后一个下划线_
后出现的文字:
保留当前的正则表达式,但指定RightToLeft
RegexOptions
。由于从右到左搜索正则表达式,因此延迟量词将匹配尽可能少的字符,直到字符串中最后一个_
之后。
修改正则表达式以禁止您要匹配的文字中的下划线_
:
_([^_]*)\Z
按_
拆分输入字符串并选择最后一项。对于此String.Split
就足够了,不需要Regex.Split
。
答案 1 :(得分:0)
从有效字符列表中排除_
:
_([^_]*)\Z
答案 2 :(得分:0)
使用正则表达式
_([^_]*)\Z
正则表达式从左向右搜索,因此贪婪控制着他们是提前还是迟到。但它不会改变比赛左端的位置。
答案 3 :(得分:0)
两个选项。
使用正则表达式:
_([^_]*?)
您只需选择_
字符或
_(\d*?)
如果您知道字符是数字(\d
)
使用子字符串:
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