我期望一个可能带有'#'或后面带有一些数字的字符串。如果#号后面有数字,我想将其捕获为第二组,否则只需捕获第一组中的所有内容。以下是C#的示例
ABC#99999
//匹配Group1:ABC和Group2:999999ABC#8
//匹配Group1 9ABC和Group9ABC
//匹配Group1 9ABC9ABC#
//匹配Group1 9ABC#
以下Regex有效,但是对于第3和第4个字符串,它捕获到第3组而不是第1组中。上述情况是否有更好的方法?
(?:(。+)#(\ d +))|(。+)
或者,我想出了以下正则表达式,但是问题在于,由于第一组没有固定格式(如长度),因此它捕获了第一和第二个字符串的整个字符串,而不是捕获了两个字符串
(。+)(?:#(\ d +))?
答案 0 :(得分:2)
要匹配整个字符串并将该部分放置在第1组的可选#
+数字之前,并将所有这些数字放入第2组,则可以使用
^(.+?)(?:#(\d+))?$
请参见.NET regex demo。添加\r?
是因为它是一个多行输入演示,如果您打算针对该模式测试单独的字符串,则不需要它。
详细信息
^
-字符串的开头(.+?)
-组1:尽可能少一个或多个字符(由于+?
惰性量词)(注意),如果可能缺少组1值,请使用(.*?)
代替)(?:#(\d+))?
-一个可选的非捕获组,匹配出现1或0次
#
-一个#
符号(\d+)
-第2组:一个或多个数字$
-字符串的结尾。答案 1 :(得分:1)
答案 2 :(得分:0)
一种替代解决方案,无需使用正则表达式:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label class="btn" for="filename-field">SELECT FILE</label>
<input type="file" id="filename-field">
输出:
输入:“ ABC#99999”:第1部分:ABC,第2部分:99999
输入:“ 9ABC#8”:第1部分:9ABC,第2部分:8
输入:“ 9ABC”:第1部分:9ABC,第2部分:[null]
输入:“ 9ABC#”:第1部分:9ABC#,第2部分:[null]