正则表达式以匹配可选组

时间:2018-07-14 21:38:38

标签: c# .net regex

我期望一个可能带有'#'或后面带有一些数字的字符串。如果#号后面有数字,我想将其捕获为第二组,否则只需捕获第一组中的所有内容。以下是C#的示例

  
      
  • ABC#99999 //匹配Group1:ABC和Group2:99999
  •   
  • 9ABC#8 //匹配Group1 9ABC和Group
  •   
  • 9ABC //匹配Group1 9ABC
  •   
  • 9ABC# //匹配Group1 9ABC#
  •   

以下Regex有效,但是对于第3和第4个字符串,它捕获到第3组而不是第1组中。上述情况是否有更好的方法?

  

(?:(。+)#(\ d +))|(。+)

或者,我想出了以下正则表达式,但是问题在于,由于第一组没有固定格式(如长度),因此它捕获了第一和第二个字符串的整个字符串,而不是捕获了两个字符串

  

(。+)(?:#(\ d +))?

3 个答案:

答案 0 :(得分:2)

要匹配整个字符串并将该部分放置在第1组的可选# +数字之前,并将所有这些数字放入第2组,则可以使用

^(.+?)(?:#(\d+))?$

请参见.NET regex demo。添加\r?是因为它是一个多行输入演示,如果您打算针对该模式测试单独的字符串,则不需要它。

详细信息

  • ^-字符串的开头
  • (.+?)-组1:尽可能少一个或多个字符(由于+?惰性量词)(注意),如果可能缺少组1值,请使用(.*?)代替)
  • (?:#(\d+))?-一个可选的非捕获组,匹配出现1或0次
    • #-一个#符号
    • (\d+)-第2组:一个或多个数字
  • $-字符串的结尾。

enter image description here

答案 1 :(得分:1)

尝试

(\w+)(?:#(\d+))?

#在一个可选的非捕获组中,而以下捕获的组中的数字内部。

https://regex101.com/r/obKPFw/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]