2016-07-13 290 views
1

我想搜索一个匹配字符串(一个占位符)的文档,我努力得到正确的表达式正确。正则表达式匹配

我试图找到将在此格式的字符串,它可以在任何地方在文档中找到

## MYPH [J @ _- JDF] ##

的正则表达式我试图使用方法是:

##MYPH\[([-!$%@^&*()_+|~=`{}:";'<>?,.\/]+(\w)+(\W)+)\]## 

##MYPH[]##将永远是相同的,但在方括号中的文字可以是任何东西。最终我只需要返回方括号中的内容。

我一直在测试这个,但我没有得到一个匹配。

我已经将+换成了*,然后我得到了一个匹配,但括号里没有任何内容。 我也尝试完全删除*+,仍然没有匹配。

谁能告诉我我做错了什么?

+3

你有没有试过['## MYPH \ [] ##'(*?)](https://开头regex101。 COM/R/nM6fA7/1)? –

+0

缺失显而易见! ## MPPH \ [。+?\] ##起作用! (用+)如果你添加作为答案我会接受它。如果你能告诉我如何获得方括号之间的文本,奖励点。 – Bex

+0

什么是正则表达式的风味/语言?然后我可以发表一个答案。或者至少了解是否要发布。 –

回答

2

您可以使用

##MYPH\[(.*?)]## 

regex demo。这个正则表达式适合短字符串。对于较长的,使用其展开的等效物##MYPH\[([^]]*(?:](?!##)[^]]*)*)]##(参见this demo)。

模式阐释

  • ##MYPH\[ - 字面##MYPH[
  • (.*?) - (捕捉组1)任何0+字符,但换行符(添加RegexOptions.Singleline标志与后面太)高达第一
  • ]## - 一个字符串]##

C# demo

var line = "##MYPH[[email protected]_-jdf]##"; 
var pattern = @"##MYPH\[(.*?)]##"; 
var m = Regex.Match(line, pattern); 
if (m.Success) 
    Console.WriteLine(m.Groups[1].Value); 

还是一个C# demo for multiple matches

var line = "##MYPH[[email protected]_-jdf]####MYPH[[email protected]_-jdf]####MYPH[[email protected]_-jdf]####MYPH[[email protected]_-jdf]####MYPH[[email protected]_-jdf]##"; 
var pattern = @"##MYPH\[(.*?)]##"; 
var m = Regex.Matches(line, pattern) 
     .Cast<Match>() 
     .Select(p => p.Groups[1].Value) 
     .ToList(); 
foreach (var s in m) 
    Console.WriteLine(s); 
0

试试这个:

##MYPH\[[\S]+\]## 
+1

请注意'[\ S] +'='\ S +' –

+0

如果[\ S] + = \ S +那么它没有错。谢谢。 –

+0

根据问题,[和]之间的部分可能是任何东西。这个正则表达式不会找到空格字符。如果[和]之间的部分为空,它也不匹配。另外,如果有两个这样的字符串彼此相邻,它只会匹配一次,认为第二个字符的结尾实际上是第一个的结尾。 –