簡體   English   中英

正則表達式問題

[英]Regular Expressions Question

我有這個程序:

        Dim words() As String = {"car", "arc", "caar"}

        For Each w In words
            Dim rx = Regex.IsMatch("rca", "^[" + w + "]+$")
            Console.WriteLine(rx)
        Next

        Console.ReadLine()

此正則表達式"^[" + w + "]+$"查找由字母 "rca" 組成的所有單詞。 這匹配所有單詞,因為所有單詞都是由“rca”組成的。 有什么我可以添加的,為“caar”返回 False,因為“rca”只有一個“a”,但“caar”有兩個“a”?

此正則表達式"^[" + w + "]+$"查找由字母"rca"組成的所有單詞

不,不是的。 它在字符串"rca"中搜索所有碰巧在w中的字母

您的意思是(鑒於您的簡單英語解釋反映了您想要的)是:

Dim rx = Regex.IsMatch(w, "^[rca]+$")

*您可以將+更改為{3} ,但這仍然匹配aaa

要匹配三個字母的任何排列,您必須自己添加排列。 正則表達式無法為您做到這一點。

Dim rx = Regex.IsMatch(w, "^rca|rac|acr|arc|car|cra$")

您可以使用以下正則表達式來執行此操作:

"(?=^[^r]*r[^r]*$)(?=^[^c]*c[^c]*$)(?=^[^a]*a[^a]*$)^[rca]+$"

它匹配任何由字母“rca”組成的單詞,但每個單詞都恰好匹配一次。

插件:如果條件是“最多一次”,您可以改為使用

"(?=^[^r]*r?[^r]*$)(?=^[^c]*c?[^c]*$)(?=^[^a]*a?[^a]*$)^[rca]+$"

您必須在正則表達式之外單獨執行此操作。 [...]構造總是將重復的字符視為輸入一次。 你可以在Console.WriteLine(rx)之前做這樣的事情(注意:寫在 C# 因為我在 VB 中不是很新):

foreach (var ch in w.ToCharArray())
{
    if (w.Count(c => c == ch) != "rca".Count(c => c == ch))
        return false;
}

目前,您似乎正在使用單詞作為搜索模式,也許您的意思是:

Dim rx = Regex.IsMatch(w, "^[rca]+$")

為了過濾掉僅包含模式中一個字母的單詞( rca ),您可以嘗試:

^[^rca]*[rca][^rca]*$

這將匹配

"anything not r, c or a" zero or many times; 
"r, c or a"; 
"anything not r, c or a" zero or many times;

暫無
暫無

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

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