Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用相同数量的“替换正则表达式”&引用;长度_Java_Regex - Fatal编程技术网

Java 用相同数量的“替换正则表达式”&引用;长度

Java 用相同数量的“替换正则表达式”&引用;长度,java,regex,Java,Regex,请参阅以下内容了解我当前的尝试: 我有一个正则表达式,它可以捕获我希望它捕获的内容,问题是String().replaceAll(“regex”,“)将所有内容替换为一个,如果它位于行的末尾,这很好,但否则它就不起作用 如何将匹配的每个字符替换为一个点,从而获得与其长度相同数量的符号 能否将正则表达式放入分组中,以便将其替换为匹配分组长度的字符串?比如: regex = (_what_i_want_to_match) String().replaceAll(regex, create strin

请参阅以下内容了解我当前的尝试:

我有一个正则表达式,它可以捕获我希望它捕获的内容,问题是
String().replaceAll(“regex”,“)
将所有内容替换为一个
,如果它位于行的末尾,这很好,但否则它就不起作用


如何将匹配的每个字符替换为一个点,从而获得与其长度相同数量的
符号

能否将正则表达式放入分组中,以便将其替换为匹配分组长度的字符串?比如:

regex = (_what_i_want_to_match)
String().replaceAll(regex, create string that has that many '.' as length of $1)
?

注意:$1是您在搜索中匹配的值


另请参见:

这不可能使用字符串#replaceAll。您可能可以使用Pattern.compile(regexp)并像这样迭代匹配:

StringBuilder result = new StringBuilder();
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(inputString);
int previous = 0;
while (matcher.find()) {
    result.append(inputString.substring(previous, matcher.start()));
    result.append(buildStringWithDots(matcher.end() - matcher.start()));
    previous = matcher.end();
}
result.append(inputString.substring(previous, inputString.length()));
要使用它,您必须定义
buildStringWithDots(int-length)
来构建包含
length
点的字符串。

考虑以下代码:

Pattern p = Pattern.compile("COG-([0-9]+)");
Matcher mt = p.matcher("Fixed. Added ''Show annualized values' chackbox in EF Comp Report. Also fixed the problem with the missing dots for the positions and the problem, described in COG-18613");
if (mt.find()) {
    char[] array = new char[mt.group().length()];
    Arrays.fill(array, '.');
    System.out.println( " <=> " + mt.replaceAll(new String(array)));
}
Pattern p=Pattern.compile(“COG-([0-9]+)”);
Matcher mt=p.Matcher(“修正了EF Comp报告中添加的“显示年度值”复选框。还修正了位置点缺失的问题以及COG-18613中描述的问题”);
if(mt.find()){
char[]数组=新字符[mt.group().length()];
数组。填充(数组“,”);
System.out.println(“+mt.replaceAll(新字符串(数组));
}
输出:


已修复。在EF Comp报告中添加了“显示年度值”复选框。还修复了位置点缺失的问题以及………

中描述的问题,这里有一个单线解决方案:

str = str.replaceAll("(?<=COG-\\d{0,99})\\d", ".").replaceAll("COG-(?=\\.+)", "....");

就我个人而言,我会简化你的生活,做一些类似的事情(对于初学者)。我让你说完

public class Test {
    public static void main(String[] args) {
        String cog = "COG-19708";

        for (int i = cog.indexOf("COG-"); i < cog.length(); i++) {
            System.out.println(cog.substring(i,i+1));
            // build new string
        }
    }
}
公共类测试{
公共静态void main(字符串[]args){
字符串cog=“cog-19708”;
对于(inti=cog.indexOf(“cog-”);i
你想做什么?他试图用文字点替换匹配中的每个字符试图用正确数量的
符号替换
COG-192029
(在不同情况下有不同数量的数字字符),即
COG-1
=>
你匹配的字符是什么?可能不是正则表达式的作业,但可能是子字符串。@MarkusKreusch:您可以详细说明您的注释吗?您可以使用匹配器搜索模式,然后调用find来查找第一个出现的COG-([0-9]+)。创建一个包含“.”的字符串,该字符串的长度为第一个匹配项的长度。然后用这个字符串替换所有匹配项。所以,如果你用你的例子,这将是好的。但使用“COG-1 COG-123456”将产生“…”这是不正确的。因此,只要输入只包含一个事件,一切都很好。如果你有多个方法,像我的答案一样会起作用。当然,如果在应该使用
时有多个匹配,我只是想向OP展示这个想法。OP可以从这里继续。非常好,遗憾的是
COG-
之后的10位以上都不起作用,虽然我怀疑是否有可能在
COG-
之后获得超过10个数字,但我将使用另一种解决方案。谢谢,虽然这个很棒!此外,它将输入中的“COG-”替换为“…”,这可能不是预期的。但总的来说,这是一个很好的解决方案@幸灾乐祸——这很容易解决——只需将“9”改为“99”(如果需要,甚至更大)。顺便说一句,你需要一个范围的原因是你不能只有“+”,因为look behinds必须有一个最大长度。@MarkusKreusch看到前面的评论,但是你已经注意到了一个小缺点,但是如果字符序列
COG-。
(包括点)出现在原始字符串中,这只是一个问题。我想不出解决这个问题的办法,但还是把代码缩短了,但我认为这是一个可以接受的差距,我希望没有人会注意到:)@schadenfloude哦,我还修改了答案以适应更大的数字序列(现在它最多可以找到99位数字)
foo bar ........ baz
public class Test {
    public static void main(String[] args) {
        String cog = "COG-19708";

        for (int i = cog.indexOf("COG-"); i < cog.length(); i++) {
            System.out.println(cog.substring(i,i+1));
            // build new string
        }
    }
}