如何删除Regex中字符串末尾的重复字符

时间:2011-05-27 03:39:35

标签: javascript regex

任何人都可以帮助我使用以下正则表达式

<script type="text/javascript">
        function quoteWords() {
            var search = document.getElementById("search_box");
            search.value = search.value.replace(/^\s*|\s*$/g, ""); //trim string of ending and beginning whitespace
            if(search.value.indexOf(" ") != -1){ //if more then one word
                search.value = search.value.replace(/^"*|"*$/g, "\"");
            }
        }
  </script>

<input type="text" name="keywords" value="" id="search_box" size="17">
<input onClick="quoteWords()" type="submit" value="Go">

问题:手动添加双引号并按提交时会中断,最后输入一个额外的双引号。正则表达式代码应该看看是否存在双引号,它不应该添加任何东西。

因此它"long enough""long enough""&lt; - 它会在末尾添加额外的双引号

任何人都可以检查正则表达式代码,以便了解如何解决此问题。

我只希望插入一次双引号。

4 个答案:

答案 0 :(得分:3)

错误肯定发生在这一行:

search.value = search.value.replace(/^"*|"*$/g, "\"");

这是因为“*匹配0或更多引号。但是,你可能不想只用”+替换它,因为那不会做你想要的双引号字符串的工作其中的空间。

你可能只想在两个陈述中做这样的事情:

search.value = search.value.replace(/^"*|"*$/g, '')
search.value = '"' + search.value + '"'

部分关键是没有“字符串结束”字符要消耗 - 正则表达式引擎“只知道”它何时位于字符串的末尾。因此,在匹配字符串末尾的引号后,光标只会移动到字符串的末尾,并且在从字符串中删除之前会再次找到空字符串。因此,字符串末尾的引号被引号替换,字符串末尾的“nothing”也被引号替换。

我建议您自己查看http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf第15.5.4.10和15.5.4.11节中的ECMAScript规范。但是,我还提供了this gist的工作原理的直观说明。

修改

由于人们似乎对为什么会发生这种情况感到困惑,所以这可能会有所帮助:

http://www.grymoire.com/Unix/Sed.html#uh-6

这是来自sed的文档,但它解释了为什么组合*和/ g是一个坏主意。事实上,当你这样做时,JS不会爆炸,这是一个有利于它的标志。请注意,字符串中的每个位置都有无限数量的“0个字符”。

答案 1 :(得分:3)

我猜你的问题是你在

这样的字符串上获得了三场比赛
  

“足够长”

第一个匹配是开始加第一个引用(因为默认情况下正则表达式是贪婪的)。第二个匹配是结束引号和字符串结尾($)。但是,由于字符串的结尾不是实际字符,因此可能会发生字符串末尾的第0个字符匹配。

一种可能的解决方案是在字符串中添加引号,然后替换一个或多个引号而不是零或多个引号:

search.value = (search.value + '"').replace(/^"*|"+$/g, "\"");

答案 2 :(得分:2)

在正则表达式中,*匹配前一项的0个或更多个实例,+匹配1个或多个实例。由于您使用的是*,因此当您的第一个正则表达式中 0 或更多字符与\s匹配时,正则表达式匹配, 0 或在你的第二个更多" s。将*更改为+应该会为您提供所期望的行为。

编辑:如果你想让结果被双引号括起来(如果它们不在行的开头或结尾),请使用/^[^"]|[^"]$这样的内容作为“开头”一行后跟除双引号之外的任何字符或除双引号之外的任何字符后跟一行“

Double Edit:应该是/^[^"\w]|[^"\w]$/,以确保您不会替换匹配的第一个和最后一个字符:/

答案 3 :(得分:1)

您可以使用+代替*

search.value = search.value.replace(/^"+|"+$/g, '"');