0

.Netを使用しています。az、AZ、スペース、一重引用符以外の文字を含む姓を一致させたいので、文字の長さは1〜40の間であってはなりません。一致させる必要のある文字列は、次のようなXMLです。<FirstName>SomeName</FirstName><LastName>SomeLastName</LastName><Address1>Addre1</Address1>

regualr式を作成しましたが、これは [a-zA-Z'。\s] {1,40}に <LastName>[a-zA-Z'.\s]{1,40}</LastName>のみ一致します。EDIT :LastNameタグがありません。しかし、私はこの表現の否定を得たいと思います。それは可能ですか、それとも別のアプローチを取るべきですか?

4

5 に答える 5

1

You can have negated character classes. [^abc] matches any character that is NOT a, b, or c. For your case, you might want [^a-zA-Z'.\s]{1,40}

Since your data is in XML tags, you will probably want to extract from those first. XML and regular expressions don't always mix well.


If you absolutely must deal with the XML tags in the regex you could try something like this:

<FirstName>([^a-zA-Z'.\s]{1,40})</FirstName><LastName>([^a-zA-Z'.\s]{1,40})</LastName>

Capture group 1 will be the first name, capture group 2 will be the last name.


Misread original question, if you want to match strings MORE than 40 characters, the length should be {41,} not {1,40}. This will ensure you only match on strings with more than 40 characters.

于 2010-10-27T20:56:07.800 に答える
1

言語で「not」タイプのロジックを使用せずにパターンマッチを無効にする方法を知りたいようですが、パターンマッチ自体に配置します。

それがあなたの本当の意味であるなら、あなたがする必要があるのはあなた"regex"をに変換することだけです"^(?:(?!regex).)*$"

1つ目は、「regex」を含むすべての文字列に当てはまり、2つ目は、「regex」を含まないすべての文字列に当てはまります。

複数行の入力文字列に注意したい場合は、"\A(?:(?!regex)(?s).)*\z"非常に注意する必要があると思います。

于 2010-10-28T16:21:19.877 に答える
0

否定文字は「^」です。したがって、式は次のようになります。

[^a-zA-Z'\S]{1,40}

否定に関するMicrosoftのサイトへのリンクは次のとおりです。

楽しみ

于 2010-10-27T20:57:39.717 に答える
0

[編集] - その他のものを削除しました。これは、テストされた文字列に XML があることを含め、テストのすべての条件 (空を含む) で機能したものです。

/^(<LastName><\/LastName>)|(<LastName>.*[^a-zA-Z'\s]+.*<\/LastName>)|(<LastName>(.{41,})<\/LastName>)$/
于 2010-10-27T21:41:58.693 に答える
0

このパターンを試してください

"<LastName>([^a-zA-Z'\s])|(.{41,})</LastName>"
于 2010-10-27T21:01:38.930 に答える