我的正则表达式有问题吗?

时间:2010-07-29 21:45:48

标签: xml regex

我制作了一个XML Schema,我就有了这个。

<xs:element name="Email">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>

我的某个XML文档中的某些电子邮件失败,我收到此错误

  

电子邮件'元素无效 - 值   'some_Name@hotmail.com'无效   根据其数据类型'String' -   模式约束失败。   LineNumber:15404 LinePostion:32

所以只要查看通过的所有电子邮件和那些失败的电子邮件,我注意到所有失败的电子邮件都有“_(下划线)”。所以我不确定这是否是原因。

修改

所以我将我的正则表达式改为

 <xs:pattern value="[\w_]+([-+.'][\w_]+)*@[\w_]+([-.][\w_]+)*\.[\w_]+([-.][\w_]+)*"/>

它现在有效,但不明白为什么\w没有抓住它。

5 个答案:

答案 0 :(得分:6)

W3C Recommendation on datatypes\w定义为:

  

[#X0000-#x10FFFF]-[\p{P}\p{Z}\p{C}](除“标点符号”,“分隔符”和“其他”字符集外的所有字符)*

underscore character definition in Unicode为'LOW LINE'(U + 005F),类别:标点符号,连接符[Pc]

因此XML Schema更符合Unicode定义处理字符类。

但对于电子邮件正则表达式,你应该使用严格的ASCII,如[0-9A-Za-z_-] intead of \w(我打赌电子邮件地址与非明字符无效:)),但更好的是找到一个经证实的regexp语法,或者查看RFC,什么是正确的电子邮件格式

答案 1 :(得分:1)

有些东西很奇怪,因为\w通常接受下划线。尝试将_添加到您期望\w进入的_,方法是将其更改为[\w_]

答案 2 :(得分:0)

很可能,因为你的正则表达式不会识别带有/下划线的电子邮件。看看这个主题:Using a regular expression to validate an email address

这是我为它的实用程序添加了书签的一个。

答案 3 :(得分:0)

是。您不匹配下划线字符。只是尝试添加它......

\w+([-+.'_]\w+)*...

答案 4 :(得分:0)

事实上有点奇怪;由于\w字符类包含下划线,正如我们在Rubular中看到的那样,您所拥有的电子邮件应该验证。是否有可能存在另一个问题 - 例如流浪空间?但是,另一个问题是没有正则表达式正确接受所有电子邮件地址而没有别的; this Stack Overflow question有一个很好的答案。与此架构/正则表达式相比,可能有更好的方法来处理验证电子邮件地址。