Нужно ли что-нибудь изменить в моем регулярном выражении? - PullRequest
0 голосов
/ 18 февраля 2011

Я хочу перевести текст фиксированной длины в XML, и я использую RegEx для этого.В позиции 36 каждой строки текстового файла указано «Инициал пользователя», для которого требуется 1 алфавитно-цифровое значение.но иногда это пусто.Поэтому я использую шаблон RegEx, например [a-zA-Z \ s] {1}, который хорош, либо соответствует 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 ''не соответствует фасету регулярного выражения' \ p {L} {1} '

Заранее спасибо!

1 Ответ

0 голосов
/ 19 февраля 2011

Я думаю, что это регулярное выражение, которое вы хотите:

[\p{L} ]
  • \p{L} соответствует любой букве, а не только буквам ASCII ([a-zA-Z]). Он включает буквы ASCII с акцентированием, такие как Ä и ñ, а также «буквы» из других сценариев и систем письма, таких как греческий, кириллица, арабский, китайский ... любые буквы, известные Unicode.

  • Поскольку ваш текстовый формат имеет фиксированную длину, я предполагаю, что отсутствующий инициал представлен пробелом, а не пустой строкой, как обычно ожидали. Я использовал буквальный пробел, но вы можете переключиться обратно на \s, если вы действительно хотите разрешить ввод табуляции, перевод строки или другие пробельные символы.

  • {1} в ваших регулярных выражениях не имеет смысла. Если вы хотите убедиться, что разрешен только один символ, вы обычно добавляете привязки, например: ^[\p{L} ]$. Но это не обязательно в XML-схеме, где все регулярные выражения всегда привязаны с обоих концов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...