在C#中拆分包含英语和希伯来语的字符串

时间:2018-09-03 09:15:37

标签: c# regex string

我有这个字符串:

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

我正尝试通过以下方式对其进行拆分:

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

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

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

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

但是我无法使其正常工作,我在做什么错了?

谢谢

6 个答案:

答案 0 :(得分:1)

尝试一下:

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

?<=-向后看-断言立即取代当前位置的情况

?=-前瞻-断言立即跟随当前位置的内容

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

答案 1 :(得分:1)

这是一种方法:

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

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

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

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

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

OR

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

我们正在使用\p{IsHebrew}\p{IsBasicLatin}之类的Unicode Named Blocks

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

工作示例:regex stormC# example

答案 2 :(得分:0)

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

这个问题有很多帖子。

例如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());
            }
        }

答案 3 :(得分:0)

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

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

\w*@gmail.com$

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

答案 4 :(得分:0)

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使用正向和反向引用对此进行了修复,(?<=\p{IsHebrew}) (?=\P{IsHebrew})将返回预期的结果:

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

将返回:

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

答案 5 :(得分:0)

为什么不简单地使用\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();