多个正则表达式与搜索算法

时间:2014-02-23 19:26:35

标签: java regex

我有一个文本文件,其中每一行都是以下任何组的随机组合

数字 - 英文字母 - 阿拉伯字母 - 标点符号

\ w由前两组的a-zA-Z0-9_组成

\ p {InArabic}为第三组

\ p {Punct}由第五组组成!“#$%&'()* +, - 。/ :;< =>?@ [] ^ _`{|}〜

我从here

获得了此信息 我读了一句话。我对这一行做的事情的唯一时间是该行包含阿拉伯字母AND(英文字母或Unicode符号)

在阅读此post和此post后,我想出了以下表达式。显然这是错误的,因为我的输出完全错误>。<

pattern = Pattern.compile("(?=\\p{InArabic})(?=[a-zA-Z])");

这是输入

1
1a
a!
aش
شa
ششa
aشش
شaش
aشa
!aش

前三个不应匹配,但我的输出显示NONE是匹配。

编辑:对不起我刚才意识到我忘了改变我的头衔。但是,如果你们中的任何一个人觉得搜索性能更好,那么请建议一个搜索算法。使用搜索算法代替正则表达式看起来很难看,但如果它表现更好,我会选择它。感谢我阅读的帖子,我了解到如果我把它放在构造函数中,我可以更快地制作正则表达式,这样它只会执行一次,而不是将它们包含在我的循环中,从而每次执行

pattern = Pattern.compile("(?=\\p{InArabic})(?=[a-zA-Z])");
matcher = pattern.matcher("");

2 个答案:

答案 0 :(得分:0)

按照你的想法,正确的模式是:

pattern = Pattern.compile("(?=.*\\p{InArabic})(?=.*[a-zA-Z\\p{Punct}])");

字符串中的相同位置不能同时跟随阿拉伯字母和标点字符或拉丁字母。换句话说,你写了一个永远错误的条件。添加.*允许字符位于字符串中的任何位置。

如果你想要一个更优化的模式,你可以使用Jason C的想法,但使用负面的字符类来减少回溯:

pattern = Pattern.compile("\\p{inArabic}[^a-zA-Z\\p{Punct}]*[a-zA-Z\\p{Punct}]|[a-zA-Z\\p{Punct}]\\P{inArabic}*\\p{inArabic}");

答案 1 :(得分:0)

如果你想找到一个混合线,你真正需要的是2个边界条件检查 成功的比赛表明混合。

   #   "\\p{InArabic}(?=[\\w\\p{Punct}])|(?<=[\\w\\p{Punct}])\\p{InArabic}"

   \p{InArabic} 
   (?= [\w\p{Punct}] )
|  
   (?<= [\w\p{Punct}] )
   \p{InArabic}