如何删除所有前导和尾随标点符号?

时间:2012-09-20 05:42:16

标签: java string punctuation

我想删除字符串中的所有前导和尾随标点符号。我怎么能这样做?

基本上,我想在单词之间保留标点符号,我需要删除所有前导和尾随标点符号。

    如果被字母包围,则允许
  1. .@_&/- 或数字
  2. 如果前面有字母或数字,则允许
  3. \'
  4. 我试过

    Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)");
    Matcher m = p.matcher(term);
    boolean a = m.find();
    if(a)
        term=term.replaceAll("(^\\p{Punct})", "");
    

    但它不起作用!!

3 个答案:

答案 0 :(得分:9)

确定。所以基本上你想在你的字符串中找到一些模式,如果匹配的模式就行动。

这样做,这种无聊的方式将是乏味的。 naiive解决方案可能涉及类似

while(myString.StartsWith("." || "," || ";" || ...)
  myString = myString.Substring(1);

如果你想做一个更复杂的任务,甚至不可能按照我提到的方式去做。

这就是为什么我们使用正则表达式。它是一种“语言”,您可以使用它来定义模式。如果字符串匹配该模式,计算机将能够说。要了解正则表达式,只需将其输入谷歌即可。第一个链接之一:http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

至于你的问题,你可以试试这个:

myString.replaceFirst("^[^a-zA-Z]+", "")

正则表达式的含义:

  • 第一个^表示在这个模式中,接下来必须是什么 字符串的开头。

  • []定义字符。在这种情况下,那些不是 (第二个^)字母(a-zA-Z)。

  • +符号表示之前的东西可以重复而且仍然可以 匹配正则表达式。

您可以使用类似的正则表达式删除尾随字符。

myString.replaceAll("[^a-zA-Z]+$", "");

$表示“在字符串末尾”

答案 1 :(得分:5)

您可以使用正则表达式:

private static final Pattern PATTERN =
    Pattern.compile("^\\p{Punct}*(.*?)\\p{Punct}*$");

public static String trimPunctuation(String s) {
  Matcher m = PATTERN.matcher(s);
  m.find();
  return m.group(1);
}

边界匹配器^$确保整个输入都匹配。

.与任何单个字符匹配。

星星*的意思是“将前面的事物匹配零次或多次”。

括号()定义了一个捕获组,其捕获值通过调用Matcher.group(1)来获取。

?中的(.*?)表示您希望匹配为非贪婪,否则尾随的标点符号将包含在组中。

答案 2 :(得分:1)

在模式上使用this教程。你必须创建一个匹配字符串的正则表达式,以字母或数字开头,以字母或数字结尾,然后inputString.matches("regex")