通过正则表达式匹配带正斜杠的单词

时间:2018-01-20 15:46:53

标签: c# regex

我正在尝试匹配以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();
}

3 个答案:

答案 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(); 匹配,然后替换它们。

regex demo

答案 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);