我需要一些关于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!
我该如何解决?
答案 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|$)
您现在需要参考中间捕获组以获取匹配字符串。