Java Regex取代了开头的每一个数字

时间:2015-08-14 21:25:32

标签: java regex

如何用正弦字符替换正则表达式的单词开头的每个数字,以及单词的其余部分将字母,数字,短划线和点之外的所有字符替换为下划线?

我试过这个正则表达式:

^(\d+)|[^\w-.]

但是,它用一个下划线字符替换开头的所有数字。

因此,34567fgf-kl.)*/676hh转换为_fgf-kl.___676hh,而我需要将开头的每个数字替换为_____fgf-kl.___676hh这样的下划线字符。

是否可以使用正则表达式实现?

3 个答案:

答案 0 :(得分:3)

您可以使用与Matcher.appendReplacement一起使用的Matcher.find来执行此操作:

String fileText = "34567fgf-kl.)*/676hh";
String pattern = "^\\d+|[^\\w.-]+";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(fileText);

StringBuffer sb = new StringBuffer();
while (m.find()) {
  m.appendReplacement(sb, repeat("_", m.group(0).length()));
}
m.appendTail(sb); // append the rest of the contents
System.out.println(sb);

repeat

public static String repeat(String s, int n) {
    if(s == null) {
        return null;
    }
    final StringBuilder sb = new StringBuilder(s.length() * n);
    for(int i = 0; i < n; i++) {
        sb.append(s);
    }
    return sb.toString();
}

请参阅IDEONE demo

此外,repeat可以使用Commons Lang StringUtils.repeat()替换为String repeated = StringUtils.repeat("_", m.group(0).length());

答案 1 :(得分:0)

您可以使用负面观察来单独匹配每个前导数字,即任何前面没有非数字的数字。

(?<!\D.{0,999})\d|[^\w-.]

由于外观的限制,它不能无限制。上面的代码最多可以处理999个前导数字。

答案 2 :(得分:0)

您还可以将replaceAll()与正则表达式一起使用:

(^\d)|(?<=\d\G)\d|[^-\w.\n]

表示匹配:

  • (^\d) - 行开头的数字,
  • | - 或
  • (?<=\d\G)\d - 如果前面有先前匹配的数字,则为数字
  • | - 或
  • [^-\w.\n] - 不是破折号,字符(\w[A-Za-z_0-9]),点或 新行(\n)。由于[^-\w.\n]是一个相当广泛的类别,也许你想添加更多的字符或字符组,以便从匹配中排除,这足以将其添加到括号内,

DEMO

如果string可以是多行,则添加

\n。如果只有一行字符串,则\n是多余的。

Java中的示例:

public class Test {
    public static void main(String[] args) {
        String example = "34567fgf-kl.)*/676hh";
        System.out.println(example.replaceAll("(^\\d)|(?<=\\d\\G)\\d|[^\\w.-]", "_"));
    }
}

带输出:

_____fgf-kl.___676hh