正则表达式 - 仅在有空格的情况下从两侧查找

时间:2011-07-27 21:11:21

标签: c# regex

我需要一些关于Regex的帮助。我需要找到一个被任何元素包围的单词,例如 - *。但是我需要匹配它,只要它在以太面上有空格或什么都没有。例如,如果它是在文本的开头,我实际上没有空间,结束时也是如此。

以下是我的目标

    string myString = "You will find *me*, and *me* also!";
    string findString = @"(\*(.*?)\*)";
    string foundText;
    MatchCollection matchCollection = Regex.Matches(myString, findString);
    foreach (Match match in matchCollection)
    {
        foundText = match.Value.Replace("*", "");
        myString = myString.Replace(match.Value, "->" + foundText + "<-");
        match.NextMatch();
    }
    Console.WriteLine(myString);

You will find ->me<-, and ->me<- also!

工作正确,问题是当我在文本中间添加*时,我不希望它与之匹配。

示例:You will find *m*e*, and *me* also!
输出:You will find ->m<-e->, and <-me* also!

我该如何解决?

2 个答案:

答案 0 :(得分:4)

尝试以下模式:

string findString = @"(?<=\s|^)\*(.*?)\*(?=\s|$)";
  • (?<=\s|^)X只有在前面有空格字符(X)或输入开头
  • 时才匹配任何\s
  • X(?=\s|$)匹配任何X,如果后跟空格字符(\s)或输入结尾。

请注意,它与*me*中的foo *me*, bar不匹配,因为第二个*后面有,!如果你想匹配它,你需要包括这样的逗号:

string findString = @"(?<=[\s,]|^)\*(.*?)\*(?=[\s,]|$)";

当然,您需要根据需要展开集[\s,]。您可能希望至少添加!?.[\s,!?.](不,.?执行需要在字符集中进行转义!)。

修改

一个小型演示:

string Txt = "foo *m*e*, bar";
string Pattern = @"(?<=[\s,]|^)\*(.*?)\*(?=[\s,]|$)";
Console.WriteLine(Regex.Replace(Txt, Pattern, ">$1<"));

会打印:

>m*e<

答案 1 :(得分:1)

您可以在比赛周围添加“行首或空格的开头”和“空格或行尾”:

(^|\s)\*(.*?)\*(\s|$)

您现在需要参考中间捕获组以获取匹配字符串。