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})", "");

但它没有用!

4

3 回答 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]+$", "");

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

于 2012-09-20T06:02:00.910 回答
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)

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

于 2020-06-26T02:04:24.677 回答
1

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

于 2012-09-20T05:49:54.977 回答