web-dev-qa-db-ja.com

文字列から英数字以外の文字(スペースを含む)を削除するにはどうすればよいですか?

ReplaceでC#の文字列とゆるいスペースから英数字以外の文字を削除するにはどうすればよいですか?

A〜z、A〜Z、0〜9、およびそれ以上(「」スペースでさえない)を保持したい。

_"Hello there(hello#)".Replace(regex-i-want, "");
_

与えるべき

_"Hellotherehello"
_

"Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", "");を試しましたが、スペースは残ります。

43
James

正規表現では、スペースを一致から除外しました(そして、私が完全に見落としていたRegex.Replace()を使用していません...):

result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", "");

動作するはずです。 +は、1つではなく連続する複数の非英数字を一度に照合することにより、正規表現を少しだけ効率的にします。

ASCII以外の文字/数字も保持する場合は、次の正規表現を使用します。

@"[^\p{L}\p{N}]+"

去る

BonjourmesélèvesGutenMorgenliebeSchüler

の代わりに

BonjourmeslvesGutenMorgenliebeSchler
59
Tim Pietzcker

Linqを使用して、必要な文字を除外できます。

  String source = "Hello there(hello#)";

  // "Hellotherehello"
  String result = new String(source
    .Where(ch => Char.IsLetterOrDigit(ch))
    .ToArray());

または

  String result = String.Concat(source
    .Where(ch => Char.IsLetterOrDigit(ch)));  

したがって、正規表現の必要はありません。

16
Dmitry Bychenko

または、これも行うことができます:

    public static string RemoveNonAlphanumeric(string text)
    {
        StringBuilder sb = new StringBuilder(text.Length);

        for (int i = 0; i < text.Length; i++)
        {
            char c = text[i];
            if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                sb.Append(text[i]);
        }

        return sb.ToString();
    }

使用法:

string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤");

//text: textLaLalol123
3
Adrianne

そして、拡張メソッドとしての置換操作として:

public static class StringExtensions
{
    public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
    {
        StringBuilder result = new StringBuilder(text.Length);

        foreach(char c in text)
        {
            if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                result.Append(c);
            else
                result.Append(replaceChar);
        }

        return result.ToString();
    } 
}

そしてテスト:

[TestFixture]
public sealed class StringExtensionsTests
{
    [Test]
    public void Test()
    {
        Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_'));
    }
}
2

上記の間違いは、Replaceを誤って使用していたことです(正規表現を使用しません、CodeInChaosに感謝します)。

次のコードは、指定されたものを実行する必要があります。

Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex
string regexed = reg.Replace("Hello there(hello#)", "");

これは与える:

regexed = "Hellotherehello"
2
James
var text = "Hello there(hello#)";

var rgx = new Regex("[^a-zA-Z0-9]");

text = rgx.Replace(text, string.Empty);
0