正则表达式与任何术语可选和任何顺序(javascript或java)

时间:2013-10-01 13:41:15

标签: java javascript regex

我有一个像这样的字符串“%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)中删除可选标记?然后表达式按预期工作。 我需要这些条款是可选的。 有人可以向我解释可选标记的内容,并且可以完成这种类型的正则表达式吗?

1 个答案:

答案 0 :(得分:0)

我不确定您的要求,但可能采用两步法:

  1. 提取%d.*%m.*%Y的排列,例如使用temp = input.replaceAll(".*(%(?:d|m|Y).*%(?:d|m|Y).*%(?:d|m|Y)).*", "$1")

  2. 替换%d%m%Y之间的内容,例如使用temp.replaceAll("(?<=%(?:d|m|Y))(.*?)(?=%(?:d|m|Y))", " ");

  3. 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}).*