我想将固定长度的文本传输到XML,我使用RegEx来完成它。 在文本文件的每一行的位置36是关于'用户的初始',其需要1个字母数字。但有时它是空白的。 所以我使用像[a-zA-Z \ s] {1}这样的RegEx模式,它很好,它可以匹配1个字母数字或空白。 但是当我使用模式进行验证时,模式表明我的RegEx与他的\ p {L} {1}不匹配,这意味着它只能是字母。 那么我应该怎么做我的RegEx?或者他们必须更改文本文件模式或更改架构。 这是我的代码示例:
Dim linePattern2 As New Regex("^(?<type_code>\d{3})(?<snm>[a-zA-Z0-9\s.\']{20})(?<gvn_nm>[a-zA-Z0-9\s.\']{12})(?<init>[\p{L} ]{1})(?<sin>\d{9})(?<rcpnt_bn>[a-zA-Z0-9\s.\']{15})(?<l1_nm>[a-zA-Z0-9\s.\']{30})(?<l2_nm>[a-zA-Z0-9\s.\']{30})")
Dim settings As New XmlWriterSettings()
settings.Indent = True
Using writer As XmlWriter = XmlWriter.Create(xmlOutput, settings)
writer.WriteStartDocument()
writer.WriteStartElement("Submission")
writer.WriteAttributeString("xmlns", "xsi", Nothing, "http://www.w3.org/2001/XMLSchema-instance")
writer.WriteAttributeString("xsi", "noNamespaceSchemaLocation", Nothing, "c:\schema\layout-topologie.xsd")
writer.WriteStartElement("Return")
writer.WriteStartElement("T4A")
Using reader As New StreamReader(textInput)
While Not reader.EndOfStream
Dim line As String = reader.ReadLine()
Dim match2 As Match = linePattern2.Match(line)
If match2.Success Then
writer.WriteStartElement("T4ASlip")
writer.WriteStartElement("RCPNT_NM")
writer.WriteElementString("snm", match2.Groups("snm").Value)
writer.WriteElementString("gvn_nm", match2.Groups("gvn_nm").Value)
writer.WriteElementString("init", match2.Groups("init").Value)
writer.WriteEndElement()
writer.WriteElementString("sin", match2.Groups("sin").Value)
writer.WriteElementString("rcpnt_bn", match2.Groups("rcpnt_bn").Value)
End If
End While
End Using
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteEndDocument()
End Using
以下是文本文件的一部分:
100AASERUDE RUSSELL ALAN 663345678000000000000000
架构验证错误是:
'init':value''与正则表达式facet不匹配'\ p {L} {1}'
提前致谢!
答案 0 :(得分:0)
我认为这是你想要的正则表达式:
[\p{L} ]
\p{L}
匹配任何字母,而不仅仅是ASCII字母([a-zA-Z]
)。它包括重音的ASCII字母,如Ä
和ñ
,以及来自其他脚本和写作系统的“字母”,如希腊语,西里尔语,阿拉伯语,中文......任何Unicode已知的字母。
由于你的文本格式是固定长度的,我假设缺少的首字母用空格表示,而不是人们通常所期望的空字符串。我使用了文字空间,但是如果你真的想要允许TAB,换行或其他空格字符,你可以切换回\s
。
正则表达式中的{1}
没有用处。如果你想确保只允许一个字符,你通常添加锚点,如下所示:^[\p{L} ]$
。但是在XML Schema中没有必要这样做,所有正则表达式总是固定在两端。