Java正则表达式:除最后一个字符外的所有字符

7
我想在每个字母后面放置一个破折号,但是我的正则表达式也会在末尾放置一个破折号。如何改进我的正则表达式?
String outputS = dnaString.replaceAll("(.{1})", "$1-");

1
点号匹配除换行符以外的任何字符 - 您确定需要在逗号后插入空格吗?请检查 outputS = dnaString.replaceAll("[\\p{L}\\p{M}](?!$)", "$0-"); - Wiktor Stribiżew
你能移除 java 标签吗? - SwiftArchitect
5个回答

11
(.)(?!$)
你可以用$1替换this.Replace。查看演示。 https://regex101.com/r/gT6vU5/11 (?!$)使用负向先行断言来表示不要捕获字符串末尾的字符。

2
谢谢!你能解释一下 (?!$) 吗? - ocram
(?!X) 通过零宽度负向先行断言匹配 X。 - Andreas

3

没有正则表达式(更快):

String[] nucleotides = dnaString.split("");
String outputS;

int seqLength = nucleotides.length;

if (seqLength > 1) {
    StringBuilder sb = new StringBuilder();
    sb.append(nucleotides[0]);

    for (int i = 1; i < seqLength; i++) {
       sb.append("-");
       sb.append(nucleotides[i]);
    }

    outputS = sb.toString();
} else {
    outputS = dnaString;
}

1

我知道这是一个老问题,但为了完整性和将来的参考,我想补充一下这个答案。

在Java 8中,您也可以使用:

String.join("-",dnaString.toCharArray());

解释:

String.join(delimiter,objects...);
String.join(delimiter,array);
String.join(delimiter,Iterable);

这些用于将所有对象使用分隔符作为分隔符连接成单个字符串。
dnaString.toCharArray();

这是一种将字符串转换为字符数组的方法。

0

这将把字符串中除了最后一个特殊字符外的所有特殊字符替换为下划线'_'

String name = "one-of-the dummy$ string:i.txt";  // input
name = name.replaceAll("[^a-zA-Z0-9](?=.*[^a-zA-Z0-9])", "_");
System.out.println(name); 

//input: one-of-the dummy$ string:i.txt
//output: one_of_the_dummy__string_i.txt

0

这个

(.)\B

不匹配最后一个字符。

查看 https://regex101.com/r/p0Z0zA/1

因此,在你的情况下,应该是:

String outputS = dnaString.replaceAll("(.{1})\\B", "$1-");

鸣谢pigreco。


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