仅当行不以#开头时,用两个单引号替换一个单引号

时间:2017-11-04 08:54:21

标签: regex ant

我尝试创建一个正则表达式替换(使用ant)来进行替换。

应该处理的文本文件包含一些以#开头的行,其中一些不是。我想仅在不以'开头的行中替换#

为此我已经发现^(?!#)将从结果中删除这些行。

此外,我已经拥有以下旧的替换正则表达式,它将所有'替换为''

match="([^'])'([^'])"
    replace="\1''\2"
    flags="g">
    <fileset dir="src/com/google/gwt/i18n/client/">
        <include name="myfiles*.properties"/>
    </fileset>
</replaceregexp>

我太愚蠢了把两者都放在一起。我使用https://regexr.com/来交互式测试新的正则表达式替换。

任何提示都受到高度赞赏。

要解析的示例文本:

# this is a comment with ' which should not be replaced
Bc700000456=translation text which may also include ' which actually be replace

祝你好运 汉纳斯

3 个答案:

答案 0 :(得分:0)

在JavaScript中结合你的两个要求非常棘手。但幸运的是 可能!

((?:^(?:#.*\n)*(?!#)[^'\n]*)?)'([^'\n]*(?:\n(?:#.*\n)*(?!#)[^'\n]*)?(?=')|[\s\S]*)

请参阅:http://regexr.com/3h3uk

警告:在特殊情况下,如果您的输入在评论之外不包含任何'个字符,则会失败。

正则表达式有点复杂,但基本方法是:通过吃掉所有评论来匹配下一个'。之后,通过吃掉所有评论直到下一个未注释的',或者吃到字符串结尾,匹配下一个'。因此,表达式依赖于至少一次'出现正常工作,否则某些已注释的'将被替换。鉴于JavaScript regex的有限功能,这是不可避免的。但如果您愿意,可以将此逻辑编程到代码中。

答案 1 :(得分:0)

我不使用ant,但因为它可以使用java.util.regex包(你可以选择哪个是带有the property ant.regexp.regexpimpl的正则表达式的默认包),我假设\G锚点支持(在最坏的情况下,没有它可以完成)以及占有量词。

您可以使用此模式:

\G([^#']*+(?:(?m:^#.*|#)[^#']*|''+[^#']*)*+)'

\1''作为替代。

demo

我们的想法是强制所有匹配与\G锚点连续,并在单引号之前捕获所有不需要替换的匹配(即以#开头的行,连续单个引用,显然所有这些都不是单引号。)

如果没有这些功能,您也可以使用以下功能:

([^#']*(?:(?:^#.*|#)[^#']*|''+[^#']*)*)('|(?![\s\S]))

并替换:\1\2\2

但你需要添加m标志。

demo

这里的连续性是通过模式匹配字符串中从开始到结束的每个位置的能力来确保的。

答案 2 :(得分:-1)

汉纳斯,

如果我想要解析一些文本,解决问题会更容易。

校准

同时我在这里有这个正则表达式,如果两端都有一个&#39;它将起作用。 https://regex101.com/r/ylnpCw/2,这对你来说可能会更好。