【问题标题】:Questions regarding single and double quotes within a regular expression?关于正则表达式中的单引号和双引号的问题?
【发布时间】:2013-02-18 07:51:47
【问题描述】:

我有这个 javascript 示例,其中包含一个允许单引号的正则表达式,但由于单引号,存在问题:

<script language="javascript">
    function checkname() {
        var name = document.getElementById('Name');
        var filter = ^[a-zA-Z'.\s]{1,50};
        if (!filter.test(name.value)) {
            alert('name is not valid');
            name.focus;
            return false;
        }
        return true;
    }
</script>

我做的测试:

  • 如果我在"regex" 周围添加singledouble quotes,则正则表达式不起作用。
  • 如果我在/regex/ 周围添加forward slashes,那么正则表达式可以工作但不完全,例如它不允许100name,但它允许name100
  • 如果我同时添加双引号和正斜杠"/regex/"'/regex/',则正则表达式不起作用。
  • 如果我添加name = name.replace(filter, '');,那么脚本将不起作用。

我的问题:

1 - 如何在正则表达式中正确包含single quote

2 - 如何正确包含double quotes


- 更新

我在asp.net 中使用RegularExpressionValidator 测试了我相同的正则表达式,它工作正常,因为我认为我可以用双引号括起来:

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" Text="name is not valid" validationgroup="validationgroup1" ValidationExpression="^[a-zA-Z'.\s]{1,50}"></asp:RegularExpressionValidator>

但在JavaScript 中,我不能将正则表达式用双引号括起来。所以一定有办法解决。

【问题讨论】:

    标签: javascript asp.net html regex validation


    【解决方案1】:

    我认为你需要的是

    var filter = /^[\w'".\s]{1,50}$/
    

    演示:Fiddle

    您可以使用\w 表示单词字符,例如a-zA-Z0-9^ 标记开始,$ 标记行结束。

    【讨论】:

    • 感谢 Arun 提供有关 \w ^$ 的信息,但恐怕解决方案不起作用。
    • 是的,脚本根本不会发出警报。我试过你的解决方案var filter = /^[\w'".\s]{1,50}$/ 这也是var filter = /^[\wa-zA-Z'.\s]{1,50}$/;
    • 浏览器控制台有错误吗?你确定 checkname() 方法被调用了吗
    • 是的,确保该函数正常工作并调用它,因为我尝试了其他不包含单引号的正则表达式,它们可以工作,例如用于电子邮件的正则表达式,但是当有单引号时,就会有问题。所以我猜问题出在正则表达式上。
    • 单引号有效还是无效
    【解决方案2】:

    你可以试试这个

    var filter = /[a-zA-Z\"']{1,50}/;
    

    【讨论】:

    • []内部没有特殊含义的特殊字符不需要转义,另外那不是有效的JS...
    • 通过转义引号,如果我输入示例100name,则正则表达式在脚本引发警报时起作用。但是对于name100,正则表达式不起作用。另外,如果没有用正斜杠包裹它,它根本不起作用。无论如何,谢谢你 ArthasNed_StarkGimli。
    • 没问题。无论如何,我都会选择 Aruns 的答案作为正确答案
    • @elclanrs 感谢您的评论,但恐怕我不确定您的意思是不是有效的 JS。
    【解决方案3】:

    您可以尝试使用以下十六进制过滤器或使用反斜杠转义 \

    var filter = /[a-zA-Z\x22\x27]{1,50}/;
    

    var filter = /[a-zA-Z\"\']{1,50}/;
    

    在十六进制中,"\x22'\x27

    这应该可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多