【问题标题】:Java regex patternsJava 正则表达式模式
【发布时间】:2011-10-02 02:06:10
【问题描述】:

我在这件事上需要帮助。查看以下正则表达式:

Pattern pattern = Pattern.compile("[A-Za-z]+(\\-[A-Za-z]+)");
Matcher matcher = pattern.matcher(s1);

我想寻找这样的词:“自制”、“aaaa-bbb”而不是“aaa - bbb”,但不是 “啊——啊——啊”。基本上,我想要以下内容:

单词 - 连字符 - 单词。

它适用于一切,除了这种模式会通过:“aaa--aaa--aaa”并且不应该。什么正则表达式适用于这种模式?

【问题讨论】:

标签: java regex


【解决方案1】:

Can 可以从表达式中删除反斜杠:

"[A-Za-z]+-[A-Za-z]+"

下面的代码应该可以工作

Pattern pattern = Pattern.compile("[A-Za-z]+-[A-Za-z]+");
Matcher matcher = pattern.matcher("aaa-bbb");
match = matcher.matches();

请注意,您可以使用Matcher.matches() 而不是Matcher.find() 来检查完整的字符串是否匹配。

如果您想使用 Matcher.find() 查看字符串内部,则可以使用表达式

"(^|\\s)[A-Za-z]+-[A-Za-z]+(\\s|$)"

但请注意,只会找到由空格分隔的单词(即没有像 aaa-bbb. 这样的单词)。为了捕捉这种情况,您可以使用lookbehinds和lookaheads:

"(?<![A-Za-z-])[A-Za-z]+-[A-Za-z]+(?![A-Za-z-])"

将读取

(?<![A-Za-z-])        // before the match there must not be and A-Z or -
[A-Za-z]+             // the match itself consists of one or more A-Z
-                     // followed by a -
[A-Za-z]+             // followed by one or more A-Z
(?![A-Za-z-])         // but afterwards not by any A-Z or -

一个例子:

Pattern pattern = Pattern.compile("(?<![A-Za-z-])[A-Za-z]+-[A-Za-z]+(?![A-Za-z-])");
Matcher matcher = pattern.matcher("It is home-made.");
if (matcher.find()) {
    System.out.println(matcher.group());    // => home-made
}

【讨论】:

  • 嗯,好的,谢谢。如果可能的话,告诉我反斜杠做了什么。我现在去测试
  • 它工作正常,但有一个问题。这不应该被考虑:aaa-bbb-ccc。它实际上让我 bbb-ccc 不应该
  • @user974594 实际上,反斜杠在您的情况下不应该做任何坏事。它也适用于您的原始表达。
  • @user974594 还有aaa-bbb-ccc 填充不匹配。
  • 完美运行。非常感谢您的详细指南:P
【解决方案2】:

实际上,如果我在字符串中使用单个单词,我无法重现您的表达中提到的问题。但是,正如 cmets 中的讨论所澄清的那样,String s 包含一个完整的句子,首先要在单词中进行标记,然后匹配或不匹配。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExp {

        private static void match(String s) {
                Pattern pattern = Pattern.compile("[A-Za-z]+(\\-[A-Za-z]+)");
                Matcher matcher = pattern.matcher(s);
                if (matcher.matches()) {
                        System.out.println("'" + s + "' match");
                } else {
                        System.out.println("'" + s + "' doesn't match");
                }
        }

        /**
        * @param args
        */
        public static void main(String[] args) {
                match(" -home-made");
                match("home-made");
                match("aaaa-bbb");
                match("aaa - bbb");
                match("aaa--aa--aaa");
                match("home--home-home");
        }

}

输出是:

' -home-made' doesn't match
'home-made' match
'aaaa-bbb' match
'aaa - bbb' doesn't match
'aaa--aa--aaa' doesn't match
'home--home-home' doesn't match

【讨论】:

  • @Howard 是的。这是我的一张通行证:home--home-home
  • 添加到我的来源并且不匹配。也许您使用的是 find() 而不是 matches()。试试我的来源。
  • Matcher matcher = pattern.matcher(sentence); for(int i=0; matcher.find(); i++){ ...
  • 现在我明白为什么了,我认为字符串已经代表了一个单词。
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 2012-03-19
  • 2016-04-24
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多