【问题标题】:Regexoptional group backreference正则表达式可选组反向引用
【发布时间】:2015-12-15 15:26:29
【问题描述】:

作为一家翻译公司,我们花费大量时间准备 Indesign 文件进行翻译。为此,我们已经创建了几个 JAVA 脚本。 我想要实现的一件事是用空格替换小数点。 这适用于具有简单正则表达式的普通数字(8.480 或 8.487),例如 ^(\d+)(\.)(\d+)$

不过,我们也有如下数字组合:1.240x899x987 或 987x1.048x987。部分或全部数字可能包含也可能不包含小数点。我可以通过使用可选组来搜索数字:^(\d+)(\.?)(\d+)(x)(\d+)(\.?)(\d+)(x)(\d+)(\.?)(\d+)$

我在使用带编号的反向引用替换这些字符串时遇到了问题。 如果可选组不为空,则它采用编号引用,并且 $1\s$3$4 返回 1 240x。但是,如果该组为空,则反向引用编号全部更改。

有没有办法在正则表达式中检查 null(如果不是 null 则)?所以我可以说'如果可选组不为空,用空格替换它'? 简而言之,我需要一种方法在单个正则表达式中将 1.287x989x150 和 987x1.048x987 和 987x313x1.487 更改为空格而不是点十进制?这甚至可能吗?

目前,我已将这三种情况拆分为单独的 javascript 中的搜索和替换 GREP,以非贪婪方式(匹配这三种情况的确切模式),但如果可能的话,if 子句将整洁得多。

亲切的问候

【问题讨论】:

  • 我认为您不需要将可选部分放在捕获组中。您可以简单地将所有点替换为空格,我认为这根本不是正则表达式任务。
  • 你需要字符串的开头和结尾吗?通常 (\d)\.(\d) 和 $1 $2 作为替换将替换所有点
  • 如果我不捕获组中的点,我将如何用空格 (\s) 替换它? $1\s$2 仅在有点时有效;如果不是,它用空格分隔数字?

标签: regex backreference


【解决方案1】:

如果点被数字包围,为什么不简化事情并用空格替换所有点?您可以通过搜索来做到这一点

(?<=\d)\.(?=\d)

并用简单的" " 替换所有内容。

【讨论】:

  • 这很有效......而且非常简单。谢谢,我在详尽的字符串中越来越深,从未想过这一点。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多