2011-10-20 18 views
4

我有一个混合的希伯来文/英文字符串来解析。 字符串是建立这样的:.NET的正则表达式引擎如何处理RTL + LTR混合字符串?

[3 hebrew] [2 english 2] [1 hebrew], 

所以,可以理解为:1 2 3,并存储为文件3 2 1(确切的字节序列,在十六进制编辑器双重检查,并无论如何,RTL只是display属性)。 .NET正则表达式解析器有RTL option,它(当给出纯LTR文本时)从字符串的右侧开始处理。

我想知道,当这个选项应用于从字符串中提取[3个希伯来语]和[2个英文]部分,或者检查[1个希伯来语]是否匹配字符串的结尾?是否有任何隐藏的细节或没有什么可担心的(如处理任何具有特殊Unicode字符的LTR字符串)?


此外,任何人都可以推荐我一个很好的RTL + LTR文本编辑器? (害怕VS Express有时显示文本错误,如果它甚至可以开始搞乱保存的字符串 - 我想重新检查文件而不再使用十六进制编辑器)

+0

如果存储字符串作为1 2 3你可能分裂两个字符串,使用RTL读它们,然后读使用默认选项的第三个字符串。我知道如何启用RTL支持的唯一方法是在Windows中启用它。 –

+1

脚本方向与此无关。正如我在我的回答中所解释的,正则表达式的RightToLeft是一个误用词,基于从左到右脚本的假设。 –

回答

3

RightToLeft选项指的是通过正则表达式需要使用的字符序列,实际上应该称为LastToFirst,因为在希伯来语和阿拉伯语的情况下,它实际上是从左到右,并且使用混合的RLT和LTR文本(例如描述表达式“从右到左”)是甚至不太合适。

这对速度影响很小(如果搜索文本是巨大的,只会重要),并在与某个startAt指标进行正则表达式(搜索字符串中比startAt,而不是在后面的字符串这些早期)。

示例;让我们希望的browers别把这太多:

string saying = "למכות is in כתר"; //Just because it amuses me that this is a saying whatever way round the browser puts malkuth and kether. 
string kether = "כתר"; 
Console.WriteLine(new Regex(kether, RegexOptions.RightToLeft).IsMatch(saying));//True 
Console.WriteLine(new Regex(kether, RegexOptions.None).IsMatch(saying));//True, perhaps minutely faster but so little that noise would hide it. 
Console.WriteLine(new Regex(kether, RegexOptions.RightToLeft).IsMatch(saying, 2));//False 
Console.WriteLine(new Regex(kether, RegexOptions.None).IsMatch(saying, 2));//True 
//And to show that the ordering is codepoint rather than physical display ordering: 
Console.WriteLine(new Regex("" + kether[0] + ".*" + kether[2]).IsMatch(saying));//True 
Console.WriteLine(new Regex("" + kether[2] + ".*" + kether[0]).IsMatch(saying));//False 
+0

'反向'是更好的名字..但等待,为什么这应该是一个选项,而不是一个功能..哦,http://stackoverflow.com/questions/228038/best-way-to-reverse-a- string-in-c-sharp-2-0 - 他们在.NET中甚至没有reverse()。 –

+2

逆转有其自身的复杂性。 –

相关问题