匹配输入 - 正则表达式帮助中引号中的第一个数字/单词/字符串

时间:2010-01-21 20:07:00

标签: c# regex

我想在输入中使用Regex匹配引号/列表中的第一个数字/单词/字符串。例如,它应该匹配那些:

  

“你好世界” gdfigjfoj sogjds

     

-14.5 fdhdfdfi dfjgdlf

     

test14 hfghdf hjgfjd

     

(a(c b 7))(3 4)“hi”

正则表达式的任何想法或我如何开始?

谢谢。

3 个答案:

答案 0 :(得分:2)

  

正则表达式的任何想法或我如何开始?

您可以从基本正则表达式的任何教程开始,例如this


[编辑] 我错过了你想数括号。在正则表达式中无法做到 - 没有任何涉及计数的事情(除了非标准的前瞻)都可以。

答案 1 :(得分:2)

如果要匹配平衡括号,正则表达式不适合作业。一些正则表达式实现确实促进了递归模式匹配(PHP和Perl,我知道),但AFAIK,C#不能这样做(编辑:请参阅下面的Steve的评论:.NET也可以这样做,之后全部)。

你可以使用正则表达式匹配一定的深度,但是你的脸很快会爆炸。例如,这个:

\(([^()]|\([^()]*\))*\)

含义

\(                        # match the character '('
(                         # start capture group 1
  [^()]                   #   match any character from the set {'0x00'..''', '*'..'ÿ'}
  |                       #   OR
  \(                      #   match the character '('
  [^()]*                  #   match any character from the set {'0x00'..''', '*'..'ÿ'} and repeat it zero or more times
  \)                      #   match the character ')'
)*                        # end capture group 1 and repeat it zero or more times
\)                        # match the character ')'

将匹配(a (c b 7))(a (x) b (y) c (z) d)等单个嵌套括号,但无法匹配(a(b(c)))

答案 2 :(得分:0)

对于前三种情况,您可以使用:

^("[^"]*"|[+-]?\d*(?:\.\d+)?|\w+)

对于最后一个,我不确定正则表达式是否可以匹配最后一个右括号。

编辑:使用建议的balanced matching作为最后一个:

^\([^()]*(((?<Open>\()[^()]*)+((?<Close-Open>\))[^()]*)+)*(?(Open)(?!))\)