【问题标题】:Regular Expressions on Punctuation标点符号的正则表达式
【发布时间】:2012-07-27 03:41:19
【问题描述】:

所以我对正则表达式完全陌生,我正在尝试使用Java 的java.util.regex 在输入字符串中查找标点符号。我不知道我可能会提前得到什么样的标点符号,除了 (1) !, ?, ., ... 都是有效的标点符号,并且 (2) "" 意味着一些特殊的东西,并且不要算作标点符号。 程序本身会伪随机地构建短语,我想在它通过随机过程之前去掉句尾的标点符号。

我可以用任何标点符号匹配整个单词,但匹配器只给我那个单词的索引。换句话说:

Pattern p = Pattern.compile("(.*\\!)*?");
Matcher m = p.matcher([some input string]);

将抓取任何末尾带有"!" 的单词。例如:

String inputString = "It is a warm Summer day!";
Pattern p = Pattern.compile("(.*\\!)*?");
Matcher m = p.matcher(inputString);
String match = inputString.substring(m.start(), m.end());

结果 --> 字符串匹配 ~ "day!"

但我希望 Matcher 仅索引 "!",所以我可以将其拆分。

我可能会提出案例,并为我可能得到的每种标点符号使用String.substring(...),但我希望我在使用正则表达式时会出现一些错误。

【问题讨论】:

  • 哦!天哪,我什至没有注意到这一点。不,这根本不是故意的——谢谢你提出来!

标签: java regex string


【解决方案1】:

我会尝试一个类似于

的字符类正则表达式
"[.!?\\-]"

[]s 中添加您希望匹配的任何字符。小心转义任何可能对正则表达式解析器具有特殊含义的字符。

然后,您必须使用 Matcher.find() 遍历匹配项,直到它返回 false。

【讨论】:

  • 提示:here 你可以读到 字符类中的特殊字符或元字符是右括号 (])、反斜杠 ()、插入符号 (^) 和连字符 ( -)。通常的元字符是字符类中的普通字符。所以"[\\.\\!\\?]""[.!?]" 相同
  • @Pshemo 谢谢,我不太确定。当然,无论如何逃避这些字符也没有什么坏处,不是吗?
  • @Pshemo:不过,您忘记在评论中转义反斜杠字符了 :)
  • @owlstead 我看到了,但是编辑和创建新评论来纠正它已经太晚了,因为上下文和链接足以弄清楚 () 中应该包含什么:D。
  • 整个字符串不匹配,所以你必须使用Matcher.find(),将此添加到答案中。匹配的字符串是group()group(0),并且应该包含一个标点符号。
【解决方案2】:

Java 确实以迂回的方式支持 POSIX 字符类。对于标点符号,[:punct:] 的 Java 等价物是 \p{Punct}

详情请看以下link

这是一个使用 cmets 表达式的具体工作示例

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

public class RegexFindPunctuation {

    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\p{Punct}");

        Matcher m = p.matcher("One day! when I was walking. I found your pants? just kidding...");
        int count = 0;
        while (m.find()) {
            count++;
            System.out.println("\nMatch number: " + count);
            System.out.println("start() : " + m.start());
            System.out.println("end()   : " + m.end());
            System.out.println("group() : " + m.group());
        }
    }
}

【讨论】:

  • 我尝试运行 Pattern.compile("\\p{Punct}") (按照您提供的链接中提到的双重转义),但它也没有找到任何标点符号。具体来说,我运行了以下代码: String input = "一天!当我走路的时候。我找到了你的裤子?开玩笑的......";模式 p = Pattern.compile("\\p{Punct}");匹配器 m = p.matcher(input);
  • 与上述相同的问题,使用Matcher.find()。请注意,对于返回所有匹配项的(内存)性能而言,这要好得多。如果你只是想匹配一个完整的字符串你不妨顺便写"input".matches("pattern")
【解决方案3】:

我会试试的

\W

它匹配任何非单词字符。这包括空格和标点符号,但不包括下划线。相当于 [^A-Za-z0-9_]

【讨论】:

  • 不幸的是,这行不通 - OP 想要一个不排除某些非标点符号的非单词字符的正则表达式,例如 。
  • 方括号,如“(”和“)”,也将被视为标点符号。
猜你喜欢
  • 2013-11-22
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多