【问题标题】:split a string that contain english and Hebrew in c#在 C# 中拆分包含英语和希伯来语的字符串
【发布时间】:2018-09-03 18:36:41
【问题描述】:

我有这个字符串:

string str = "לא קיימת תוכנה לשליחת מיילים במכשיר, אנא פנה אלינו ישירות ל moshecohen@gmail.com";

我正在尝试按以下方式拆分它:

string[0] = "לא קיימת תוכנה לשליחת מיילים במכשיר, אנא פנה אלינו ישירות ל "
string[1] = "moshecohen@gmail.com"

我正在使用这种拆分方法:

string[] split =  Regex.Split(str, @"^[א-ת]+$");

我想在希伯来语和英语单词之间进行拆分,但是如果最后一个单词与当前单词相同,请将其添加到最后一个

但我不能让它工作,我做错了什么?

谢谢

【问题讨论】:

  • “我不能让它工作”——你得到了什么而不是预期的结果?
  • 规则是什么?在电子邮件前用空格分割字符串?
  • 模式指定了分割器。您的代码要求输入由任何希伯来语字符分隔的字符串,但前提是 entire 字符串是希伯来语。这是自相矛盾的。也许您想在最后一个希伯来语字符和第一个拉丁语字符之间进行拆分?
  • 抱歉不清楚。我想在希伯来语和英语单词之间进行拆分,但是如果最后一个单词与当前单词相同,请将其添加到最后一个。

标签: c# regex string


【解决方案1】:

试试这个:

string[] split = Regex.Split(str, @"(?<=[א-ת]+) (?=[A-z]+)")

?&lt;= - lookbehind - 断言当前位置之前的内容

?= - 前瞻 - 断言紧跟当前位置的内容

这会将字符串“splitter”解析为希伯来字符和拉丁字符之间的位置

【讨论】:

  • 这个(?&lt;=[א-ת]+) (?=[A-z]+) 在很多情况下都不起作用(例如,当一个希伯来字母跟在 ASCII 后面或者单词之间有 1 个以上的空格时),请注意 [A-z] does not match only letters
  • @WiktorStribiżew 你能否提供一个“[hebrew] [e-mail address]”字符串的例子,我写的东西不起作用?
  • 当然,他可以微调 [A-z] 部分以仅匹配电子邮件而不匹配更多
  • 您可以使用命名块来捕获希伯来语和非希伯来语字符,例如(?&lt;=\p{IsHebrew}) (?=\P{IsHebrew})")
【解决方案2】:

这是一种方法:

[\p{IsHebrew}\P{L}]+|\P{IsHebrew}+

将此模式与Regex.Matches 一起使用:

var matches = Regex.Matches(input, @"[\p{IsHebrew}\P{L}]+|\P{IsHebrew}+");

该模式有两个部分。它要么匹配:

  • [\p{IsHebrew}\P{L}]+ - 包含希伯来字符和非字母的块,

  • \P{IsHebrew}+ - 非希伯来语字符块(包括非希伯来语字母和其他非字母字符)。

我们使用Unicode Named Blocks,如\p{IsHebrew}\p{IsBasicLatin}

类似的选项是[\p{IsHebrew}\P{L}]+|[\p{IsBasicLatin}\P{L}]+ - 专门匹配带有拉丁(英文)字母的块。

工作示例:regex stormC# example

【讨论】:

  • @VladiPavelka - 谢谢!
【解决方案3】:

你为什么不这么想?这里的问题是:如何从文本中获取电子邮件。

这个问题有很多帖子。

例如,this

public static void emas(string text)
        {
            const string MatchEmailPattern =
           @"(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@"
           + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
             + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
           + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})";
            Regex rx = new Regex(MatchEmailPattern,  RegexOptions.Compiled | RegexOptions.IgnoreCase);
            // Find matches.
            MatchCollection matches = rx.Matches(text);
            // Report the number of matches found.
            int noOfMatches = matches.Count;
            // Report on each match.
            foreach (Match match in matches)
            {
                Console.WriteLine(match.Value.ToString());
            }
        }

【讨论】:

【解决方案4】:

从您输入的字符串中,我们可以考虑将字符串拆分为希伯来语,并在字符串末尾添加一个电子邮件地址。

那么正则表达式可以是(只是例子):

\w*@gmail.com$

您可以在这里测试正则表达式:https://regexr.com/

【讨论】:

    【解决方案5】:

    Regex.Split 中的模式与 分隔符 匹配,并且不包含在结果中。看起来你想在最后一个希伯来语和第一个非希伯来语字符之间分开,例如:

    Regex.Split(str,@"\p{IsHebrew} \P{IsHebrew}")
    

    \p{} 捕获属于特定Unicode character class or named block 的字符,而\P{} 将其排除在外。

    不幸的是,这种模式将排除最后一个希伯来语和第一个非希伯来语字符并返回:

    לא קיימת תוכנה לשליחת מיילים במכשיר, אנא פנה אלינו ישירות   
    oshecohen@gmail.com 
    

    捕获组用于在结果中包含由分隔符模式捕获的字符。只需使用 (\p{IsHebrew}) (\P{IsHebrew}) 的组将返回每个捕获组作为单独的结果:

    לא קיימת תוכנה לשליחת מיילים במכשיר, אנא פנה אלינו ישירות  
    ל 
    m 
    oshecohen@gmail.com 
    

    Vladi Pavelka 使用前向和后向引用解决了这个问题,(?&lt;=\p{IsHebrew}) (?=\P{IsHebrew}) 将返回预期结果:

    Regex.Split(str,@"(?<=\p{IsHebrew}) (?=\P{IsHebrew})")
    

    将返回:

    לא קיימת תוכנה לשליחת מיילים במכשיר, אנא פנה אלינו ישירות ל 
    moshecohen@gmail.com 
    

    【讨论】:

      【解决方案6】:

      为什么不直接使用\p{IsHebrew}

      类似的东西

       string str = "לא קיימת תוכנה לשליחת מיילים במכשיר, אנא פנה אלינו ישירות ל moshecohen@gmail.com";
       string pattern = @"[\p{IsHebrew}]+";
       var hebrewMatchCollection = Regex.Matches(str, pattern);
       string hebrewPart = string.Join(" ", hebrewMatchCollection.Cast<Match>().Select(m => m.Value));  //combine regex collection
       var englishPart = Regex.Split(str, pattern).Last(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 2021-04-13
        • 1970-01-01
        相关资源
        最近更新 更多