java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

Posted

技术标签:

【中文标题】java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔【英文标题】:java regex match string containing words with no digits and optionally separated by comma 【发布时间】:2013-12-19 06:59:53 【问题描述】:

受上一个问题的启发,我试图找到一个匹配包含至少一个仅由字符而非数字组成的单词的字符串的正则表达式。所以 \w 不适用。逗号分隔的单词只有在没有连续两个逗号的情况下才可以。

这是我发现的最好的:

(.*\s+,?)*([a-zA-Z]+)+(,?\s+.*)*

但它与以下字符串不匹配:

aaaaa,11111
11111,aaaaa
11111,aaaaa,
,aaaaa
aaaaa,
,aaaaa,
aaaaa,11111,,
,,aaaaa,bbbbb
aaaaa,,bbbbb,ccccc
aaaaa,bbbbb,,ccccc
aaaaa,bbbbb,ccccc
aaaaa,11111

这是一个确定正则表达式是否正确的测试程序:

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone

public static void main (String[] args) throws java.lang.Exception

    String regex = "(.*\\s+,?)*([a-zA-Z]+)+(,?\\s+.*)*";
    String shouldMatch[] = new String[] 
        "aaaaa",
        "aaaaa bbbbb",
        "aaaaa 11111",
        "11111 aaaaa",
        "aaaaa,11111",
        "aaaaa, 11111",
        "aaaaa,  11111",
        "11111,aaaaa",
        "11111, aaaaa",
        "11111,  aaaaa",
        "11111,aaaaa,",
        ",aaaaa",
        "aaaaa,",
        ",aaaaa,",
        "aaaaa,11111,,",
        ",,aaaaa,bbbbb",
        "aaaaa1111 bbbbb",
        "aaaaa1111 bbbbb ccccc",
        "aaaaa1111bbbbb ccccc",
        "aaaaa11111bbbbb ccccc 22222",
        ",,aaaaa bbbbb",
        "aaaaa,,bbbbb ccccc",
        "aaaaa,,bbbbb,ccccc",
        "aaaaa,bbbbb,,ccccc",
        "aaaaa,bbbbb,ccccc",
        "aaaaa,11111"
    ;

    String shouldNotMatch[] = new String[] 
        "aaaaa11111",
        "11111bbbbb",
        "aaaaa11111bbbbb",
        "aaaaa11111bbbbb 11111ccccc",
        "aaaaa11111bbbbb ccccc11111",
        "aaaaa,,bbbbb",
        "aaaaa,,11111",
        ",,aaaaa",
        "aaaaa,,",
        "11111",
        "11111,22222",
        "11111 22222",
        ""
    ;

    boolean result = true;

    for(String stringToTest : shouldMatch)
        if (!(stringToTest.matches(regex)))
            System.out.println(stringToTest + " Don't match. WRONG.");
            result = false;
        
    

    for(String stringToTest : shouldNotMatch)
        if (stringToTest.matches(regex))
            System.out.println(stringToTest + " Match. WRONG.");
            result = false;
        
    

    if (result)
        System.out.println("Congratulation, your regex is right.");
    
    else 
        System.out.println("Result of one ore more test is wrong.");
    


编辑:添加了一些不应与正则表达式匹配的字符串、空字符串和数字(​​加上逗号或空格)。

【问题讨论】:

你说如果逗号不在一行的话csw没问题,但是有几个例子像:",,aaaaa bbbbb",应该匹配? @SteveP。 ,,aaaa,bbbb 应该匹配,因为 bbbb 前面只有一个逗号 "aaaaa,,bbbbb ccccc" 也匹配。 @SteveP。 OP 正在测试匹配词的存在性 @SteveP。是的,也许我不清楚。如果至少有一个由字符组成的单词并且可选地后接或前接一个逗号,则它应该匹配。所以,aaaaa,,bbbbb cccc 应该匹配,因为 ccccc 是对的。 【参考方案1】:

这行得通,我检查了你的测试程序:

String regex = "^.*?(?<=\\s|^|,)(?<!,,)[A-Za-z]+(?!,,)(?=\\s|,|$).*$";

^ "begins with".*? non-greedy for any non-newline character(?&lt;=\\s|^|,) 积极寻找空格或字符串开头或@987654326 @,因为它们是唯一可以出现在我们定义的单词之前的有效字符(?&lt;!,,) 否定查找 ,,,因为现在允许它们出现在单词之前[A-Za-z]+ 1 个或更多字母(?!,,) 否定前瞻 ,,,因为它们现在允许在单词之后(?=\\s|,|$) 肯定前瞻空格或字符串结尾或 ,,因为它们是唯一可以在我们定义的单词之后出现的有效字符$ "ends with"

【讨论】:

@holap 这非常复杂。一开始看起来很简单。编写测试程序做得很好,这让你更容易弄清楚你想要什么/什么有效。 我把它放在了 Debuggex.com(选择 Python)。它给出了一个很好的图形。试试吧。你甚至可以点击“Embed in ***”,抓取代码并添加到这里! 你这个摇滚老兄!是的,这个问题起初对我来说似乎也很简单,但我意识到根本不是。这个正则表达式会教我很多我想的东西。非常感谢。我会研究它,也许我需要进一步解释。 @holap 没问题。我添加了一个图形,这可能会有所帮助。祝你好运!这是一个有趣的问题!【参考方案2】:

根据您的示例,以下应该可以工作:

String regex = "(?i)(?=.*?(?<!,,)\\b[a-z]+\\b(?!,,))[, \\w]+";

【讨论】:

您在提出问题的 5 分钟内成功创建了此视觉效果。这很让人佩服!你用了什么? @ChthonicProject:在 debuggex.com 上创建 @anubhava 通过他的测试程序运行它,很多,我不记得了。 @anubhava 您的回复令人印象深刻。它不适用于“11111,aaaaa”,或者“aaaaa,,bbbbb”,但也适用于其他许多。 @SteveP。是的,我正在看那个。不是我很困惑,,aaaaa,bbbbb 应该匹配但aaaaa,,11111 不应该。

以上是关于java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔的主要内容,如果未能解决你的问题,请参考以下文章

❤️Linux三剑客与管道符正则表达式的使用❤️

正则表达式

python正则表达式及RE模块

python正则表达式及RE模块

JAVA正则表达式判断 只能包含汉字、英文、“_”和数字 ,正则该怎么写呢?

Python正则表达式详解