2016-04-28 42 views
4

我有一个像正则表达式来获得括号之间的文本与偶尔缺少括号

The quick brown [fox] jumps over the lazy [dog] 

一些文字,如果我使用正则表达式

\[(.*?)\] 

我得到的匹配,而

fox 
dog 

工作我正在寻找一个正则表达式,即使在其中一个大括号缺失的情况下也能正常工作。

举例来说,如果我有这样的

The quick brown [fox jumps over the lazy [dog] 

文字我想比赛返回“狗”

更新: 另一个例子,如果我有这样的

The quick brown [fox] jumps over the lazy dog] 
文本

我想要匹配返回“狐狸”

文本可以有多个tiple匹配和多个大括号可能也会丢失:(。

我也可以使用C#来完成从正则表达式匹配得到的结果的子字符串。

+0

这只适用于平衡组。 –

+0

单词匹配是否满足您的需求? – Xiaoy312

回答

1

如果您打算匹配任何东西,但[[最接近之间]]同时捕捉里面是什么,使用

\[([^][]*)] 

图案的详细资料

  • \[ - 文字[
  • ([^][]*) - Group 1 captur荷兰国际集团比[]其他0+字符(如[^...]否定的字符类和它比里面的类中定义的其他的所有字符匹配)(该组1个值经过Regex.Match(INPUT_STRING, REGEX_PATTERN).Groups[1].Value访问)
  • ] - 字面] (它没有一个字符类的外部进行转义)

regex demo这里是C# demo

var list = new List<string>() {"The quick brown [fox] jumps over the lazy dog]", 
     "The quick brown [fox] jumps over the lazy [dog]", 
     "The quick brown [fox jumps over the lazy [dog]"}; 
list.ForEach(m => 
      Console.WriteLine("\nMatch: " + 
       Regex.Match(m, @"\[([^][]*)]").Value + // Print the Match.Value 
       "\nGroup 1: " + 
       Regex.Match(m, @"\[([^][]*)]").Groups[1].Value)); // Print the Capture Group 1 value 

结果:

Match: [fox] 
Group 1: fox 

Match: [fox] 
Group 1: fox 

Match: [dog] 
Group 1: dog 
1

在这里你去:\[[^\[]+?\]

它只是避免了拍摄[与焦炭类。

4

试试这个:\[[^[]*?\]

它会跳过所有比赛,如果它包含[字符。

+0

这比我的建议效率低,因为惰性匹配比贪婪的匹配具有适当的字符类别昂贵。此外,[它不捕获'狐狸',它匹配[狐狸]'](http://regexstorm.net/tester?p=%5c%5b%5b%5e%5b%5d*%3f%5c%图5d和I表示+快速+棕色+%5bfox%5D +跳跃+超过+的+懒惰+狗%5D%0D%0aThe +快速+棕色+%5bfox%5D + +过跳跃+的+懒惰+%5bdog%5D%0D% 0aThe +快速+褐色+%5bfox +跳跃+在+的+懒+%5bdog%5D)。 –

+0

我测试过[这里](http://regexr.com/),它的工作原理。但谢谢你的提示。 – MaKCbIMKo

+0

我只是说它并不是当前任务中最有效的模式。我觉得你不确定懒惰匹配的作品。见[我的这个答案](http://stackoverflow.com/questions/36770799/perl-regex-matching-optional-phrase-in-longer-sentence/36787675#36787675)关于懒惰和贪婪的量化模式如何工作。 –

相关问题