0

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

4

1 回答 1

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))", " ");

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}).*在第一步中。

于 2013-10-01T14:01:12.430 回答