【问题标题】:Java Regex pattern that matches in any online tester but doesn't in Eclipse在任何在线测试器中匹配但在 Eclipse 中不匹配的 Java 正则表达式模式
【发布时间】:2015-09-03 22:49:56
【问题描述】:

我有一段代码无法在安装了 Java 1.7 的 Eclipse 上运行。

我想使用一个正则表达式来匹配并从每个匹配项中提取 2 个字符串,因此我为此使用了 2 个组。

我已经在许多网站(在线正则表达式测试器)中测试了我的表达式,它适用于他们,但它不适用于我在 Eclipse 中的 Java 项目。

源字符串看起来像以下任何一个:

正式语言:isNatural

注释工具:isHuman%Human 注释器:isHuman

混合注释:conceptType%Hybrid 注释工具:conceptType%Hybrid 标签集:conceptType

...等等。

我想为每个匹配提取“:”之前的第一个单词和之后的单词。

我使用的正则表达式是这样的:

(\w*\s*\w+):(\s+\w+)%{0,1}

以及代码的sn-p:

String attribute = parts[0];                            
Pattern pattern = Pattern.compile("(\\w*\\s*\\w+):(\\s+\\w+)%{0,1}");
Matcher matcher = pattern.matcher(attribute);
OWLDataProperty dataProp = null; 

if (matcher.matches()){
    while (matcher.find()){
        String name = null, domain = null;

        domain = matcher.group(1);
        name = matcher.group(2);

        dataProp = factory.getOWLDataProperty(":"+Introspector.decapitalize(name), pm); 

        OWLClass domainClass = factory.getOWLClass(":"+domain.replaceAll(" ", ""), pm);
        OWLDataPropertyDomainAxiom domainAxiom = factory.getOWLDataPropertyDomainAxiom(dataProp, domainClass);
        manager.applyChange(new AddAxiom(ontology, domainAxiom));
    }

你们中有人知道为什么它不起作用吗?

非常感谢。

【问题讨论】:

  • 好的,我找到了如何让它工作:只使用没有 .matches() 的 .find() 方法,因为在这种情况下可能有多个匹配项。非常感谢!

标签: java regex eclipse


【解决方案1】:

当使用matches() 时,您是在询问您提供的字符串是否与您的整个正则表达式匹配。就好像您在正则表达式的开头添加了^,在结尾添加了$

您的正则表达式在其他方面很好,并返回您所期望的。我建议测试它regexplanet.com, Java mode。您将看到matches() 何时为真,false 何时为真,以及每个find() 将返回什么。

要解决您的问题,我认为您只需删除if (matcher.matches()) 条件即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多