簡體   English   中英

通過正則表達式將單詞與正斜杠匹配

[英]Matching words with a forward-slash via Regular Expression

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

在字符串“ / exit”的開頭,沒有單詞邊界/b因為“ /”不是字母,數字或下划線。 (在“ /” 之后有一個單詞邊界)

您可以滾動自己的“智能字邊界”以將這些正斜杠匹配為有效的“字”字符:

(?:((?<!/)\B(?=/))|\b(?=\w))

用英語,這意味着您必須具有“ NON word boundary,后跟沒有任何前面斜杠的斜杠” (?<!/)\\B(?=/)或“提供的常規單詞邊界您可以在\\b(?=\\w)之后“看到”一個字母數字。 通過將\\B與“ /”一起使用,我們可以獲得“偽單詞邊界”行為:

    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();

可能(並且可能有)更簡單的方法來解決此問題,尤其是如果您可以“預處理”模式片段列表,以先用靜態標記替換特殊字符,再與常規\\b匹配,然后再替換它們。

正則表達式演示

由於您已經知道/包含在所有單詞中,
您可以將它們從命令列表中排除。

更改commands.Add("/exit"); 到此commands.Add("exit");

然后照常進行,轉義元字符並加入。

然后,由於您只關心/不以/ all開頭
開頭需要的多數民眾贊成是(?<!/)/

至於最后,我將使用條件詞邊界(?(?<=\\w)\\b)
我的意思是,這就是您真正需要的。

放在一起,正則表達式行將是:

var regexPattern = $@"(?<!/)(/(?:{joinTheWords}))(?(?<=\w)\b)";

查找帶有正斜杠的單詞的一種不太干凈的方法(但很簡單)是用接受的(但從未使用過的字符串)替換正斜杠,並在正則表達式搜索中使用它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM