簡體   English   中英

你能構建一個RegEx來用下划線替換不需要的字符嗎?

[英]Can you construct a RegEx to replace unwanted characters with the underscore?

我正在嘗試編寫一個字符串'clean-up'函數,它只允許使用字母數字字符,以及其他一些字符,例如下划線,句點和減號(破折號)字符。

目前我們的函數使用源字符串的直接字符迭代,但我正在嘗試將其轉換為RegEx,因為從我一直在閱讀的內容,它更清晰,更高效(在直接迭代中,這似乎是向后的,但是在我得到一個有效的RegEx之前,我無法對其進行分析。)

這個問題對我來說是雙重的。 一,我知道以下正則表達式......

[a-zA-Z0-9]

...匹配一系列字母數字字符,但我如何還包括下划線,句號和減號字符? 你只是用'\\'字符逃脫它們並將它們放在括號中與其余部分?

其次,對於任何不屬於匹配的角色(即其他標點符號,如'?'),我們希望將其替換為下划線。

我的想法是匹配一系列所需的字符,我們匹配一個不在所需范圍內的單個字符,然后替換它。 我認為RegEx就是將克拉作為括號之間的第一個字符包括在內......

[^a-zA-Z0-9]

這是正確的方法嗎?

可能最有效的方法是設置一個靜態正則表達式來描述您要替換的字符。

public static class StringCleaner
{    
    public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

    public static string ReplaceInvalidChars(string input)
    {
        return invalidChars.Replace(input, "_");
    }
}

但是,如果您不希望正則表達式替換行尾和空格(如空格和制表符),則需要使用稍微不同的表達式。

public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-\s]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

此外,以下是您必須轉義以匹配文字字符的規則:

在由方括號表示的集合中,您必須轉義這些字符-#]\\它們出現的任何位置,並且^僅當它出現在集合的第一個位置以匹配文字字符時才會出現。 在集合之外,您必須轉義這些字符: .$^|{}[]()+?#以匹配文字字符。

有關更多信息,請參閱以下文檔:

如果您嘗試刪除不需要的字符, Regex.Replace會為您提供更好的服務:

string cleaned = Regex.Replace(input, "[^a-zA-Z0-9_.]|-", "_");

要包含' - '字符,您可以使用正則表達式OR來包含該字符,雖然可能有一種方法將它包含在字符類中,但它現在正在逃避我。

編輯:您實際上不需要顯式包含連字符,因為它無論如何都不匹配該類。 也就是說,如果你想用下划線替換連字符,只需使用[^a-zA-Z0-9_.]作為你的類......任何與這些類不匹配的東西都將被替換。 但是在類中包含連字符的正確方法是使用反斜杠( \\- )來轉義它,或者你可以把它放在類列表的乞討中: [^-a-zA-Z0-9_.]

我認為使用字符串的Replace方法是完美的。

public string StringClean(string source, char replacement, char[] targets)
{
  foreach(char c in targets)
  {
  //...
  }
}

(不是VS,所以也許不是完美的代碼)

如果您需要使用下划線替換所描述的模式上沒有的所有字符,請執行以下操作:

string result = Regex.Replace(YourOriginalString, "[^a-zA-Z0-9_.-]", "_");

暫無
暫無

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

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