簡體   English   中英

是否可以否定正則表達式搜索?

[英]Is it possible to negate a regular expression search?

我正在用C#構建一個詞法分析引擎。 在大多數情況下,它已經完成並且運行良好。 我的詞法分析器的功能之一是它允許任何用戶輸入自己的正則表達式。 這使引擎可以處理各種有趣的事情,並輸出標記化的文件。

我遇到的問題之一是我希望用戶擁有此標記化文件中包含的所有內容。 IE,他們正在尋找的零件,而不是他們所尋找的零件(部分突出顯示將是一個很好的例子)。

基於我的詞法分析器強調的方式,我發現實現此目的的最佳方法是否定用戶給出的正則表達式。

因此,如果用戶希望為每次出現的“ T” lex一個字符串,則否定版本將找到除“ T”之外的所有內容。

現在,上面的操作很容易實現,但是如果用戶提供8種復雜性質的不同表達方式,有沒有辦法將所有這些表達方式合而為一呢?

您可以使用(pattern1)|(pattern1)| ...將多個RegEx合並為1。要否定它,只需檢查!IsMatch

var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})"); 

實際上會返回2個令牌(請注意,我已經使用過兩次相同的名稱..沒關系)還可以瀏覽Regex.Split。 例如:

var split = Regex.Split("aa bb cc dd", @"(?<token>aa bb)|(?:\s+)");

將單詞作為標記返回,但“ aa bb”除外,該字符作為一個標記返回,因為我是用(?...)定義的。

您還可以使用Index和Length屬性來計算正則表達式無法識別的中間部分:

var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})");
for (int i = 0; i < matches.Count; i++)
{
   var group = matches[i].Groups["token"];
   Console.WriteLine("Token={0}, Index={1}, Length={2}", group.Value, group.Index, group.Length);
}

暫無
暫無

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

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