3

分割と正規表現を一緒に使用して、行内の特殊コードを分離したいと考えています。これは私の行です:

14S15T3C16W17A0-20m0-7T

ここで、各項目を分離したいと思います。項目は、たとえば 14S、15T、7T などです。これは、ランダムな長さの数字と、その数字の後の 1 つのアルファベットで構成されます。

例: 125125125125125X または 11T。

0- という例外もあり、これらはそのまま残り、分離する必要があります。

私は自分で正規表現を作成しました:

Dim digits() As String = Regex.Split(line, "([0-9][A-Z]|0-)")

しかし問題は、組み合わせの 1 桁しかとらないことです。

どうすればこの問題を解決できますか?

4

2 に答える 2

3

各トークンを終了する単一のアルファベット文字またはスラッシュ-( の場合) があるため、次の正規表現0-を使用して分割できます。Regex.Split

(?<=[-a-zA-Z])

(?<=pattern)ゼロ幅(テキストは消費されない) の肯定的な後読みであり、現在の位置の前のテキストがpattern内部と一致する場合に一致します。

上記の正規表現は、現在の位置の前の文字がアルファベット (大文字または小文字)a-zA-Zまたはダッシュ-であることを確認し、現在の位置で分割します。


Regex.Matchesまたは、次の正規表現を使用してこれを行うことができます。

[0-9]+[A-Za-z]|0-

数値は任意の長さになる可能性があるため、1 つ以上の量指定子 +が必要です。それはあなたが試したことに非常に近いので、残りは明らかです。


どちらの方法も、有効な入力に対して同じ効果を持つはずです (仕様によると)。ただし、入力が無効な場合、Regex.Splitアプローチは無効なトークンを生成しますが、Regex.Matchesアプローチは有効なトークンを生成します (無効な文字/シーケンスをスキップします)。

于 2013-02-18T12:55:25.477 に答える
0

11T2B13D を 11T 2B 13D に分割することが目標の場合は、正規表現を 1 つ以上の数値に変更する必要があります。したがって、[0-9]+[AZ]|0- を使用します。+ 演算子 (複数の演算子を意味する) が存在しない場合は、代わりに [0-9][0-9] [AZ]|0- を試してください。(ゼロ以上を意味します)。

于 2013-02-18T12:55:07.480 に答える