Java:replace()以正则表达式结尾的n管道定界符

时间:2019-04-23 14:14:26

标签: java regex string

我正在尝试替换第一个“ |”但要从字符串末尾开始:

@receiver(post_save, sender=Match)
def update_club_score(sender, instance, **kwargs):
    # Local won.
    if instance.score_local > instance.score_visitor:
        instance.club_local.won += 1
        instance.club_local.save()
        instance.club_visitor.lost += 1
        instance.club_visitor.save()
    # Local lost.
    if instance.score_local < instance.score_visitor:
        instance.club_visitor.won += 1
        instance.club_visitor.save()
        instance.club_local.lost += 1
        instance.club_local.save()
    # Draw
    if instance.score_local == instance.score_visitor:
        instance.club_local.draw += 1
        instance.club_local.save()
        instance.club_visitor.draw += 1
        instance.club_visitor.save()

我的文件名为usr/bin/pipe|pipe|name|28|-rwxr-xr-x|root:root||46711b361edd4512814d9b367ae765f42a71d729708b3f2e162acb8f64592610| ,我希望我的正则表达式返回我pipe|pipe|name

我从以下正则表达式开始:usr/bin/pipe|pipe|name,但我不知道如何进一步:https://regex101.com/r/ttbiab/3

在Java中:

.([^\|]*)$

3 个答案:

答案 0 :(得分:0)

You can try something like this [\|]([^\|]*[\|]){5}$. It matches the pipe count of 5 followed by first pipe from the ends.

答案 1 :(得分:0)

如果直到字符串末尾有固定数量的6个管道,并且您想在替换之前选择单个管道,则可以使用\G来声明前一个位置匹配并使用前瞻性断言,右边的是6倍而不是管道,后面是管道。

(?:([^\|]*)|\G(?!^))\|([^|]*)(?=(?:[^|]*\|){6})

在Java中:

String regex = "(?:([^\\|]*)|\\G(?!^))\\|([^|]*)(?=(?:[^|]*\\|){6})";
  • (?:非捕获组
    • ([^\|]*)使用negated character class在第1组中捕获的管道不匹配0次以上
    • |
    • \G(?!^)在上一场比赛的末尾而不是在开始时断言
  • )关闭非捕获组
  • \|([^|]*)匹配管道,并且在第2组中捕获的匹配次数是管道的0+次
  • (?=非捕获组
    • (?:[^|]*\|){6}正向前进,断言右边的是6倍而不是管道,然后是管道
  • )关闭非捕获组

Regex demo | Java demo

如果要用例如#替换管道,请使用2个捕获组:

$1#$2

答案 2 :(得分:0)

根据您的评论,您似乎不知道文件名中将包含多少个管道,但是您要做知道输入字符串中有多少个管道是 aren' t 。在这种情况下,正则表达式可能不是最佳方法。有两种不同的方法可以执行此操作,但也许最容易理解和维护的方法之一是拆分String,然后在适用的情况下使用替换将其重新组合:

String input = "usr/bin/pipe|pipe|name|28|-rwxr-xr-x|root:root||46711b361edd4512814d9b367ae765f42a71d729708b3f2e162acb8f64592610|";
String pipeReplacement = ":124:";
int numberOfPipesToKeep = 7;

String[] split = input.split("\\|");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < split.length; i++) {
    sb.append(split[i]);
    if (i < split.length - numberOfPipesToKeep) {
        sb.append(pipeReplacement);
    } else {
        sb.append("|");
    }
}

String output = sb.toString();
System.out.println(output);

上面的示例可以处理任意数量的管道,可以进行配置,并且(在我看来)比尝试使用正则表达式更容易理解和调试。