在正则表达式如何在不在其他字母字符内时查找和替换字符?

时间:2016-11-30 19:51:26

标签: javascript regex

我正在javascript Regex格式化日期时间字符串,所以我想:

  1. d不在其他字母字符内时,查找并替换所有d个字符。像这样: enter image description here

  2. dd不在其他字母字符内时,查找并替换所有dd个字符。像这样: enter image description here

  3. 我测试了/\bd\b/mg模式,但结果并不是我每次都想要的。

    如何在以下命令中排除不需要的案例:

    str = str.replace(/\bd\b/mg, number);
    

2 个答案:

答案 0 :(得分:1)

您发布的正则表达式不会将System.out.println(freeSpot.get(0)[0]); 视为单词边界,因此它不会按预期替换该字符。

为了在要替换 System.out.println(freeSpot.get(0)[1]); 字符之前或之后包含此字符,您可以使用与以下类似的表达式:

  1. 替换_

    d
  2. 替换d

    /(\b|_)(d)(\b|_)/mg
    
  3. 或者以同样的方式替换它们(如果它可以接受):

    dd

    this answer in another thread on StackOverflow下的评论中,还建议使用可以格式化日期的库,而不是自己实现它。

    更新:正如有人提到的,问题还在于,在正则表达式中包含/(\b|_)(dd)(\b|_)/mg ,在替换后将其删除。但是,您可以调用replace并使用捕获括号引用,如下所示:

        /(\b|_)(d|dd)(\b|_)/mg
    

    我已更新此答案中发布的早期表达式,以便使用此方法。

    请注意,我不知道您要考虑的所有情况,因此如果您在使用建议的解决方案时遇到任何问题或者在您的情况下无法正常工作,请告诉我,所以我可以尝试帮助。

答案 1 :(得分:1)

我可以使用前瞻,如果你不使用JavaScript,那么也可以使用lookbehind。

示例lookahead检查是否没有以下字符:

(?=[^a-zA-Z])

如果您使用的是JavaScript,它不支持lookbehind,因此您需要使用捕获组和反向引用。

对于JS捕获最外面括号中的部分,然后使用\ 1,\ 2 ...来定位:

[^a-zA-Z](d(?=[^a-zA-Z]))

非JS可以使用lookbehind:

(?<=[^a-zA-Z])d(?=[^a-zA-Z])