java正则表达式匹配由4个空格包围的单词

时间:2017-07-10 15:46:55

标签: java regex

我的文字包含开头用2个空格包围的单词,最后用2个空格包围的单词:

  

“my_text_is__separated__like_this__example __”

所以我想检索'分开'和'示例'。

我是这样实现的:

    String pattern = "\\s{2}(\\w+)\\s{2}";

    String t = getText();
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(t);
    StringBuilder b = new StringBuilder();
    while (m.find()) {
        b.append(m.group(1) + "xxx\n");
    }
    Log.d("hmmmmm", b.toString());

但它不起作用(m.find()为false)。

修改:这是我的文字:

  

حدثناالحميديعبداللهبنالزبيرقالحدثناسفيانقالحدثنايحيىبنسعيدالأنصاريقالأخبرنيمحمدبنإبراهيمالتيميأنهسمععلقمةبنوقاصالليثي يقولسمعتعمربنالخطابرضياللهعنهعلىالمنبرقالسمعترسولاللهصلىاللهعليهوسلميقولإنماالأعمالبالنياتوإنمال كلامرئمانوىفمنكانتهجرتهإلىدنيايصيبهاأوإلىامرأةينكحهافهجرتهإلىماهاجرإليه。

例如,'سفيان'和'بالنيات'应该是输出中的

注意:在示例中,我用(_)替换了空格,使其变得更加明显。

注意:我的文字是阿拉伯语

编辑结果证明它没有用双倍空格分隔,请参阅下面的答案。

1 个答案:

答案 0 :(得分:3)

Java Pattern将“单词字符”\w定义为[a-zA-Z_0-9],因此阿拉伯语文本不匹配(旁注:欧洲口音也不匹配,例如“éèö”)。< / p>

根据this answer,您可以将[\u0600-\u06FF]用于阿拉伯语而不是\w 根据{{​​3}},您可以使用\p{InArabic},这似乎更好。

此外,您的文字片段不包含2个连续的空白字符,因此\s{2}不会获得任何匹配。似乎看起来像眼睛的“双重空间”实际上是空格,后跟unicode that answer,它是十六进制的200F。这样就可以与\\s\\x{200f}(\\p{InArabic}+)\\s\\x{200f}匹配。 例如:

    System.out.println(Arrays.toString(new boolean[] {
            "###  hey  ###".matches(".*\\s{2}\\w+\\s{2}.*"),
            "###  tût  ###".matches(".*\\s{2}\\w+\\s{2}.*"),
            "###  لتَّيْم  ###".matches(".*\\s{2}\\w+\\s{2}.*"),
            "###  لتَّيْم  ###".matches(".*\\s{2}\\p{InArabic}+\\s{2}.*")
    }));
    Matcher matcher = Pattern.compile("\\s\\x{200f}(\\p{InArabic}+)\\s\\x{200f}").matcher(getText());
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

其中getText()返回您的文字片段,会打印:

[true, false, false, true]
سُفْيَانُ
يَقُولُ
بِالنِّيَّاتِ
يُصِيبُهَا

现在我不确定期望你的文字在特定单词周围包含这些标记并明确地匹配它是否是一件好事: - /

我不知道regexr.com是如何工作的,因为我认为JavaScript \w意味着和Java一样(我看不到网络往返所以它必须用JS实现,可能有一些层但转型。甚至他们自己的嵌入式文档都说\w

  

匹配任何单词字符(字母数字和下划线)。仅匹配low-ascii字符(无重音或非罗马字符)。相当于[A-Za-z0-9 _]