我有一个像这样的字符串“%d-%m-%Y”,这些术语中的任何一个都可以是任何顺序,短划线可以是另一个字符串(%x)。 我想得到的结果为:“%d%m%Y”。 我烘焙了一个直截了当的正则表达式,如果我将术语设为可选,它就无法工作: (在chrome控制台中执行此操作:)
"%d-%m-%Y HH:%i".replace(/.*?((%Y|%m|%d)?.*?(%Y|%m|%d)?.*?(%Y|%m|%d)?).*/, "$1 $2 $3 $4")
我有这个(%Y |%m |%d)?作为可选3次使用。*? (他们之间没有贪婪)。
如果我运行上面的代码行,则输出为:
"%d %d "
如果我从(%Y |%m |%d)中删除可选标记?然后表达式按预期工作。 我需要这些条款是可选的。 有人可以向我解释可选标记的内容,并且可以完成这种类型的正则表达式吗?
答案 0 :(得分:0)
我不确定您的要求,但可能采用两步法:
提取%d.*%m.*%Y
的排列,例如使用temp = input.replaceAll(".*(%(?:d|m|Y).*%(?:d|m|Y).*%(?:d|m|Y)).*", "$1")
替换%d
,%m
和%Y
之间的内容,例如使用temp.replaceAll("(?<=%(?:d|m|Y))(.*?)(?=%(?:d|m|Y))", " ");
Java示例:
String input ="xx %Y-%m-%d xx";
String temp = input.replaceAll( ".*(%(?:d|m|Y).*%(?:d|m|Y).*%(?:d|m|Y)).*", "$1" );
String output = temp.replaceAll( "(?<=%(?:d|m|Y))(.*?)(?=%(?:d|m|Y))", " " );
System.out.println(output); //results in "%Y %m %d"
注意:
- 这需要3个组件,即%d-%m
不匹配。
- "%d-%d"
仍然被允许,检查正则表达式会很难。
更新:以下表达式应允许在第一步中使用1-3个组件:.*?(%(?:d|m|Y)(?:.*%(?:d|m|Y)){0,2}).*
。