【问题标题】:Regex to match 2 or none?正则表达式匹配 2 还是不匹配?
【发布时间】:2011-06-07 11:05:44
【问题描述】:

我有这个正则表达式来识别该行是否包含两个下划线:

\s*_{2}(\w+)

任何空格,两个下划线,然后是一个单词。事实证明,我也需要知道根本没有下划线,所以我有:

\s*(\w+)

可选空格后跟一个单词。然后我得到第 1 组,这是我的话。到目前为止,一切都很好。

问题是使用两个下划线时所采取的操作,几乎与不使用下划线时的代码相同(除了我提出一个标志)

if( s =~ uderscore ) { 
   takeGroup( 1 )
   yada yada 
   flag = true
} else if( s =~ noUnderscore { 
  takeGroup( 1 ) 
  yada yada 
   flag = false 
}

我认为必须有更好的方法,而不是复制整个正则表达式并进行测试。

【问题讨论】:

  • \s*_{2}?(\w+) 应该为你做。
  • 我认为这里的问题会知道我是否需要升旗。

标签: java regex regex-group


【解决方案1】:

改用这个正则表达式:

\s*(_{2})?(\w+)

然后简单地测试第一组是否存在——如果存在,则下划线存在。原来的第 1 组将成为第 2 组。

【讨论】:

  • 更正(至少在我的测试中)如果不存在,则第一组为空。
【解决方案2】:
\s*(__)?(\w+)

(__)? 是两个下划线的可选组。请注意,该词现在将位于组 2 而不是 1。如果您不想更改组编号,则可以使用非捕获组 (?:__)

【讨论】:

  • 啊,是的,那是我的另一个问题(我忘了提),当我分组时,数字改变了。所以我必须添加额外的检查才能知道是否有 2 组或 3 组并相应地滑动?什么是“非捕获组”?因为我需要知道(举旗)但我不想改变所有的数字(如果我能帮忙的话):P
  • 使用非捕获组和根本不设置组有什么区别?
  • 组是为了能够使下划线一起可选(如果你刚刚做了__?,那么只有第二个下划线是可选的)。
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多