如何用正弦字符替换正则表达式的单词开头的每个数字,以及单词的其余部分将字母,数字,短划线和点之外的所有字符替换为下划线?
我试过这个正则表达式:
^(\d+)|[^\w-.]
但是,它用一个下划线字符替换开头的所有数字。
因此,34567fgf-kl.)*/676hh
转换为_fgf-kl.___676hh
,而我需要将开头的每个数字替换为_____fgf-kl.___676hh
这样的下划线字符。
是否可以使用正则表达式实现?
答案 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]
是一个相当广泛的类别,也许你想添加更多的字符或字符组,以便从匹配中排除,这足以将其添加到括号内, \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