【问题标题】:JS regex matching ' but not \'JS正则表达式匹配'但不是\'
【发布时间】:2014-10-04 03:09:24
【问题描述】:

我想替换字符串中的简单引号,而不是转义的引号(在 JavaScript 中)。例如我想要这个字符串:

'Hello there! I\'m \'Doug\''

变成:

"Hello there! I\'m \'Doug\'"

注意:我进行了大量研究和测试(例如在 regex101.com 上),发现了一些东西,例如 Regular expression to match a line that doesn't contain a word?,但仍然无法弄清楚如何构建合适的正则表达式。

我尝试过的事情

  • /[^\\]'/g
  • /\\{0}'/g
  • /[\\]{0}'/g
  • ...

【问题讨论】:

  • JS regex matching “ but not \” 但输入仅包含单引号。
  • 为什么' in I'm 没有被替换?
  • s/^'/"/s/'$/"/
  • 你能告诉我们你到目前为止尝试过的代码吗?
  • @AvinashRaj 因为它没有被转义?

标签: javascript regex


【解决方案1】:

您可以将此String#replacecallback 函数一起使用:

str = "'Hello there! I\\'m \\'Doug\\''";
str = str.replace(/(\\)?'/g, function($0, $1) {
   return ($1) ? "\\'" : '"';
});
console.log( str );
//=> "Hello there! I\'m \'Doug\'"

【讨论】:

  • 有点奇怪,我的字符串不包含双 \ 来转义简单的引号。
  • 打印不是双引号,只会显示单引号\
  • 是的,但是您的原始字符串包含双反斜杠,而不是我的。我的例子是'Hello there! I\'m \'Doug\'' 不是'Hello there! I\\'m \\'Doug\\''
  • 你错了。使用alert("'Hello there! I\'m \'Doug\''") 查看打印的内容。
  • 我的错,你是对的!这实际上有点奇怪,但现在我明白了 :) 非常感谢您的宝贵时间。
【解决方案2】:

这很接近:

subject.replace(/^'|([^\\])'/g, '$1"')

它不会连续捕获两个撇号,但我想你可以运行两次。

【讨论】:

  • 谢谢,但是如果字符串包含 X 撇号怎么办?我需要运行多少次?似乎有最好的方法来做到这一点。
  • 如果它包含 X 撇号,则必须运行两次。它将替换所有其他的。
【解决方案3】:

不幸的是,除了它的可移植性和强大功能之外,javascript 不支持后视。

我制作了一个正则表达式,在有多个撇号的情况下也能很好地工作:

^'|[^\\](')[']+|([^\\])'

替换为$1"

Online demo

【讨论】:

  • 你越来越近了,但"Hello there! I\''''''m \'Doug\'" 应该会导致"Hello there! I\'"""""m \'Doug\'"
【解决方案4】:

也许你只需要这个:

var text = "'Hello there! I'm \'Doug\''"; 
text.replace(/^\'|'$/g, '"')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多