我正在尝试匹配以C#中的正斜杠开头的单词。
例如/exit
我尝试使用正则表达式\b(/exit)\b
,但出于某种原因它并不匹配。
这是我正在尝试的示例代码:
static void Main(string[] args)
{
var commands= new List<string>();
commands.Add("/exit");
var listOfString = commands.Select(Regex.Escape).ToList();
var joinTheWords = string.Join("|", listOfString);
var regexPattern = $@"\b({joinTheWords})\b";
var theRegex= new Regex(regexPattern, RegexOptions.IgnoreCase);
Console.WriteLine(theRegex);
Console.WriteLine(theRegex.Match(@"/exit").Success);
Console.WriteLine("Press any key to exit.");
Console.ReadLine();
}
答案 0 :(得分:1)
在字符串&#34; / exit&#34;的开头,没有字边界vendor/composer/autoload_static.php
,因为&#34; /&#34;不是字母,数字或下划线。 (&#34> &#34; /&#34;
你可以滚动自己的&#34;智能词边界&#34;包括匹配这些正斜杠作为有效的&#34; word&#34;字符:
/b
在英语中,这意味着您必须有一个&#34; NON字边界,后跟一个没有任何前面斜线的斜杠&#34; (?:((?<!/)\B(?=/))|\b(?=\w))
,或&#34;常规字边界,前提是您可以查看&#39;之后的一个字母数字&#34; (?<!/)\B(?=/)
。通过使用带有&#34; /&#34;的\b(?=\w)
,我们可以获得&#34;伪字边界&#34;行为:
\B
可能(并且可能是)更简单的方法来解决这个问题,特别是如果你能够&#34;预处理&#34;模式片段列表首先用静态标记替换特殊字符,与常规 var commands = new List<string>();
commands.Add("/exit");
List<String> listOfString = commands.Select(Regex.Escape).ToList();
String joinTheWords = string.Join("|", listOfString);
var regexPattern = $@"(?:(?:(?<!/)\B)(?=/)|\b(?=\w))({joinTheWords})\b";
var theRegex = new Regex(regexPattern, RegexOptions.IgnoreCase);
Console.WriteLine(theRegex);
Console.WriteLine(theRegex.Match("/exit").Success);
Console.WriteLine("Press any key to exit.");
Console.ReadLine();
匹配,然后替换它们。
答案 1 :(得分:1)
由于您已经知道/
包含在所有单词中,
你可以将它们从命令列表中分解出来。
将commands.Add("/exit");
更改为此commands.Add("exit");
然后像往常一样,逃离metachars并加入。
然后,因为您只关心/
之前没有/
全部
开头所需要的是(?<!/)/
。
至于结尾,我会使用条件词边界(?(?<=\w)\b)
我的意思是,这就是你真正需要的。
将所有这些放在一起,正则表达式就是:
var regexPattern = $@"(?<!/)(/(?:{joinTheWords}))(?(?<=\w)\b)";
答案 2 :(得分:0)
查找带有正斜杠的单词的一种不太干净的方法(但很简单)是将正斜杠替换为可接受的(但从未使用过的字符串),并在正则表达式搜索中使用它:
str = "this is a search string with /exit and/exit";
key = "/exit";
value="/EXIT";
str = str.replace(/\//gi, "_a_a_");
k = key.replace(/\//gi, "_a_a_");
var regex = new RegExp('\\b' + k + '\\b', "g");
str = str.replace(regex, value) ;
str = str.replace("_a_a_","/");
console.log(str);