【问题标题】:Matching Cyrillic symbols in C#在 C# 中匹配西里尔符号
【发布时间】:2011-12-17 02:40:29
【问题描述】:

我有一个巨大的代码文件,其中包含许多这样的行:

Enterprise::TextMessageBox::Show(String::Format(S"Възникнал е проблем:\n\n{0}", e->Message), S"Грешка");

我想要做的是用我提供的另一个文本找到带有西里尔符号字符串的代码的每一部分。我的问题是我似乎无法做出足够好的表达,所以我可以抓住台词。 另一个问题是,有时这些行只包含一个这样的字符串,但有时它们在一行中包含 2 个或更多。

每个这样的字符串都是相似的,看起来像这样:

S"some cyrilic symbols"

我尝试使用 Regex 类来制作它,但我似乎无法为字符串制作足够好的模式。

【问题讨论】:

  • 老兄不要告诉我我的程序是什么...字符串 im looking for are from managed c++ actually but im 键入应用程序来完成我在 C# 中需要的任务所以请不要更改我的标签!
  • 您正在尝试编写脚本,或者使用“在文件中查找”对话框获取代码中出现的列表?无论如何,如果同一行有两个实例,会有什么问题?
  • 我正在加载一个逐行读取的文本,我想用我选择并保存新文件的另一个字符串替换包含此字符串的所有行。但无论我尝试什么模式,它都找不到任何线条。
  • 你是对的,对不起,我把问题弄错了
  • 您要替换哪个部分:文本还是代码?如果您尝试替换代码,则查找匹配的引号而不是引号之间的内容可能要简单得多。您能否编辑您的问题以显示您要查找的内容的示例您要替换的内容?如果有你不想匹配的行,一个例子也会有帮助

标签: c# regex


【解决方案1】:

好的,您可以匹配 Unicode 属性。试试这样的

Regex TheRegex = new Regex(@"S""[\p{IsCyrillic}\p{P}\p{N}\s]*""");

\p{IsCyrillic} 匹配任何西里尔字符

\p{P} 是标点符号的 unicode 类别

\p{N} 是任何语言的数字的 unicode 类别

\s 匹配一个空格

See here on msdn 了解有关 unicode 类别的更多信息,请访问regular-expressions.info

【讨论】:

    【解决方案2】:

    你能尝试用这三种方式之一打开你的文件吗,这取决于它是如何保存的,但对我来说,规则是 string 是 unicode,所以这些读取的本地字符编码为 un​​icode,然后是 @987654322 @ 应该可以工作。

        /* Open OEM File*/ 
    FileStream f1 = new FileStream(@"..\..\Datas\TestOEM.txt",FileMode.Open);
    StreamReader sw1 = new StreamReader(f1,
        Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage));
    string a = sw1.ReadLine();
    Console.WriteLine(a);
    sw1.Close();
    f1.Close();
    
      /* Open Unicode file */
    FileStream f2 = new FileStream(@"..\..\Datas\TestUNICODE.txt",FileMode.Open);
    StreamReader sw2 = new StreamReader(f2,Encoding.Unicode);
    string b = sw2.ReadLine();
    Console.WriteLine(b);
    sw2.Close();
    f2.Close();
      /* Open ANSI file */
    
    FileStream f3 = new FileStream(@"..\..\Datas\TestANSI.txt",FileMode.Open);
    StreamReader sw3 = new StreamReader(f3,Encoding.Default);
    string c = sw3.ReadLine();
    Console.WriteLine(c);
    sw3.Close();
    f3.Close();
    

    可以循环使用正则表达式

    Regex reg0 = new Regex(@"Възникнал е проблем",
                             RegexOptions.Compiled | RegexOptions.IgnoreCase);
    if (reg0.IsMatch(string from file)){...}
    

    【讨论】:

      【解决方案3】:

      试试这个正则表达式:-

          Match match = Regex.Match(input, @"YourReplacementText",
          RegexOptions.Multiline | RegexOptions.IgnoreCase);
      
      // Here we check the Match instance.
      if (match.Success)
      {
          // Do your stuff
      }
      

      输入 - 这是你的西里尔输入字符串

      YourReplacementText - 这是你的西里尔替换字符串

      RegexOptions.Multiline | RegexOptions.IgnoreCase - 表示这个正则表达式,忽略大小写并检查多行。

      正则表达式的简写:

      /Грешка/gim
      

      Грешка - 将此文本更改为您想要的文本以用于替换/匹配目的

      i - 表示忽略大小写

      m - 表示多行

      g - 代表全局,用于迭代匹配

      【讨论】:

      • 你错过了重点,OP想要匹配带有任何西里尔字母而不是特定单词的字符串。
      猜你喜欢
      • 2018-02-19
      • 2016-05-10
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多