我正在尝试替换第一个“ |”但要从字符串末尾开始:
@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中:
.([^\|]*)$
答案 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倍而不是管道,然后是管道)
关闭非捕获组如果要用例如#
替换管道,请使用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);
上面的示例可以处理任意数量的管道,可以进行配置,并且(在我看来)比尝试使用正则表达式更容易理解和调试。