如何删除所有开头和结尾的标点符号?

8

我想要移除字符串中所有开头和结尾的标点符号。如何实现这个功能?

基本上,我想要保留单词之间的标点符号,并且需要移除所有开头和结尾的标点符号。

  1. ., @, _, &, /, - 只有被字母或数字包围时才允许存在。
  2. \' 只有在前面是字母或数字时才允许存在。

我尝试过

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

但是它没有起作用!!

2
你可以轻松地使用java.util.regex包中的类来构建一个正则表达式。 - Jan Hruby
3个回答

11

好的,基本上您想在字符串中找到某种模式,并在匹配到该模式时进行操作。

以朴素的方式执行此操作将很繁琐。朴素的解决方案可能涉及以下内容:

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

如果你想要完成一些更复杂的任务,按照我之前提到的方法可能会变得不可能。

这就是为什么我们使用正则表达式,它是一种“语言”,可以用它来定义一个模式。计算机将能够确定一个字符串是否符合该模式。要了解正则表达式,请在Google中键入它。其中一个最初的链接:http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

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

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

这个正则表达式的含义:

  • 第一个 ^ 意味着在此模式中,接下来的内容必须位于字符串的开头。

  • 方括号 [] 定义了字符集。在本例中,它包含(第二个 ^)非字母(a-zA-Z)的字符。

  • 加号 + 表示其前面的内容可以重复出现并仍然匹配该正则表达式。

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

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

$表示“在字符串的结尾”


如果您只考虑罗马/拉丁文,那么可以这样做。即便如此,这也可能取决于您的需求或目的,因为在某些语言(例如英语和法语)中,撇号可能构成单词,并且在某些情况下可能不被视为“标点符号”。 - Tom Bogle

6
您可以使用正则表达式:
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)获取其值。
(.*?)中的问号?表示您希望匹配为非贪婪模式,否则尾随的标点符号将包含在该组中。

1

参考this中的模式教程。您需要创建一个正则表达式,该表达式匹配以字母或数字开头和以字母或数字结尾的字符串,并执行inputString.matches("regex")


我是JAVA的新手,对于正则表达式一无所知。 :( - user1618820

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接