使用正则表达式匹配字符串中的一个匹配项

Ken*_*thJ 7 regex

前几天我坐着一个正则表达式问题.最终我用不同的方式解决了它,没有正则表达式,但我仍然想知道你是怎么做的:)

我遇到的问题是通过自动脚本运行svn update,我想检测冲突.使用或不使用正则表达式执行此操作是微不足道的,但它让我想到了一个更加模糊的问题:如何在空白的固定长度字段内完全匹配一个字符?

例如,假设我们想在六字节宽字段内匹配"C":

"C     " MATCH
"   C  " MATCH
" C C  " NO MATCH
"  M   " NO MATCH
"      " NO MATCH
"C      " NO MATCH (7 characters, not 6)
"   C " NO MATCH (5 characters, not 6)

Ken*_*thJ 7

我知道回答你自己的问题是不对的,但我基本上把你的答案合并了......请不要火焰:)

^(?=.{6}$) *C *$

编辑:更换.Tomalak的反应低于[C],速度提高了约4-5%左右

^(?=[ C]{6}$) *C *$

  • @tomalek你修改后的变体在两次出现的C中仍然失败.面对它,就像你不想拥有它一样,你需要结束$ :) (2认同)
  • @KennethJ 当然[回答你自己的问题](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)当然是对的!:) (2认同)

Tom*_*lak 5

^(?=[ C]{6}$) *C(?! *C)
Run Code Online (Sandbox Code Playgroud)

说明:

^             # start-of-string
(?=[ C]{6}$)  # followed by exactly 6 times " " or "C" and the end-of-string
 *C           # any number of spaces and a "C"
(?! *C)       # not followed by another C anywhere (negative lookahead)

笔记:

  • ^(?=…{6}$)构造可用于任何您想要测量字符串长度但不实际匹配任何内容的地方.
  • 由于字符串的结尾已在前瞻中检查过,因此您不需要$在正则表达式的末尾添加一个,但这样做并没有什么坏处.