複数の区切り文字を含むString.split()を使用する


201

区切り文字-とに基づいて文字列を分割する必要があり.ます。以下は私の望ましい出力です。

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

しかし、私の次のコードは機能しません。

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

おっしゃったとおり、問題なく動作しているようです。希望する出力は何ですか?
ジェフ

2
@ジェフ:彼は希望する出力(AA/ BB/ CC...)を示しました
TJクロウダー

2
本気ですか?私はそれを彼の現在の出力であり、彼の望ましい出力ではないと解釈しました。たぶん立ち上がって少し歩き回る時間かもしれません。
ジェフ

@ジェフ:混乱してすみません、誤解を解消するために投稿を更新しました。
タンファン

Regexはパフォーマンスを低下させます。私は文字ごとに行き、必要に応じて文字列を分割するメソッドを書くことをお勧めします。これをさらに最適化して、log(n)のパフォーマンスを得ることができます。
Princesh 2013

回答:


311

正規表現OR演算子を含める必要があると思います。

String[]tokens = pdfName.split("-|\\.");

一致するもの:
[DASHとDOTが一緒に] [DASHまたはDOTのいずれか ]で-.
はない、または
-.


9
なぜ2つのバックスラッシュが必要なのですか?
pjain 2016

7
.正規表現の文字は、改行以外の文字を意味します。tutorialspoint.com/java/java_regular_expressions.htmただし、この場合、実際のキャラクターが必要.でした。2つの円記号は、を参照していることを示しています.。バックスラッシュはエスケープ文字です。
Monkeygrinder、2016

2
通常の場合.split("match1|match2")は(たとえばsplit("https|http"))、\\は.上記の場合の特殊文字をエスケープすることです
prayagupd

または一般的に、pdfName.split("\\W");以下のように使用できます@Peter Knego answer
ahmednabil88

1
[-.]代わりに使用-|\\.
Saeed

49

この正規表現を試してください"[-.]+"。+は、連続する区切り文字を1つとして扱います。これが必要ない場合は、プラスを削除してください。


8
@Lurkers:ピーターが脱出する必要がなかった唯一の理由は、それが内-最初の考え[]だったからです。これは文字列リテラルであるため、2つ必要です)。
TJクラウダー

論理演算子|を使用すると、区切り文字の1つが結果の「トークン」の一部になる可能性があるという問題があるため、この答えは受け入れられたものよりも優れていると思います。これは、Peter Knegoの[-。] +
Jack '

26

正規表現「\ W」を使用できます。これは、単語以外の任意の文字に一致します。必要な行は次のようになります。

String[] tokens=pdfName.split("\\W");

私にとってはうまくいきません `String s =" id(INT)、name(STRING)、 "。ここで\\ Wを使用すると、長さが6の配列が作成されますが、4だけである必要があります
user3527975

2
これは、入力にUnicode文字が含まれている場合にも機能しません。で「すべてを取得」するのではなく、実際の区切り文字のみを含めるのが最善\Wです。
nhahtdh、2015年

13

指定する文字列splitは正規表現の文字列形式なので、次のようになります。

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

これは、内の任意の文字で分割することを意味します[]-内部[]では特殊なのでバックスラッシュでエスケープする必要があります。もちろん、これは文字列なのでバックスラッシュをエスケープする必要があります)。(逆に、.通常は特別ですが、内部では特別ではありません[]。)


この場合、[-.]範囲として解釈できない可能性があるため、ハイフンをエスケープする必要はありません。
アランムーア

1
@アラン:それはクラスの一番最初のものなので、それは本当です。しかし、私はいつもそうしています。後で戻って、何も考えずにその前に何かを追加するのは簡単です。エスケープしてもコストはかからないので...
TJクロウダー

括弧をエスケープする方法を知っていますか?私は、「200」、「工学」に分割したいという文字列「[200]エンジニアリング」を持っている
scottysseus

3
わあ、わかりました... 1つではなく2つのバックスラッシュを使わなければなりませんでした。String[] strings = codes.get(x).split("\\[|\\]| ");<-興味のある方のためのコード
scottysseus 2013

13

Guavaを使用してこれを行うことができます:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

4

デリミタ「AND」と「OR」としての2つの文字シーケンスの場合、これは機能するはずです。使用中にトリミングすることを忘れないでください。

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

結果:都市= {"イスタンブール"、 "ニューヨーク"、 "パリ"、 "東京"、 "モスクワ"}


{「イスタンブールAND」、「ニューヨークAND」、「パリOR」、「東京AND」、「モスクワ」}などの出力を取得するにはどうすればよいですか
Ahamadullah Saikat '21

3

私はApache Commonsを使用します。

インポート org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

StringUtils.splitByWholeSeparator(str, separator)完全な文字列をセパレータとして使用するのではなく、指定されたセパレータのいずれかで分割されます


3
String[] token=s.split("[.-]");

9
StackOverflowは無料のコード作成サービスであるという誤解を解消するために、コードのみの回答に説明を追加してください。
ユンノシュ

2

次のようなものを使用することをお勧めします:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

他のいくつかのキャラクターをサンプルとして追加しました。方法.'処理されるので、これは最も安全な使用方法です。


1

また、split()メソッドの引数として正規表現を指定することもできます。以下の例を参照してください。

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}

1

このコードを試してください:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

1
StackOverflowは無料のコード作成サービスであるという誤解を解消するために、コードのみの回答に説明を追加してください。
ユンノシュ

0
s.trim().split("[\\W]+") 

うまくいくはずです。


2
まず、いいえ、それは機能しません-投稿する前に試すことができますか?その後、この答えはあなたと同じですが、うまくいきます。最後に、フォーマットを確認する必要があります(動作するはずです)。
2017年

1
StackOverflowは無料のコード作成サービスであるという誤解を解消するために、コードのみの回答に説明を追加してください。
ユンノシュ

-1

文字列が常に同じ形式になることがわかっている場合は、最初に文字列を基づいて分割.し、最初のインデックスにある文字列を変数に格納します。次に、-インデックス0、1、2に基づいて2番目のインデックスの文字列を分割し、インデックス0、1、2を格納します。最後に、前の配列のインデックス2を分割して.、関連するすべてのフィールドを取得します。

次のスニペットを参照してください。

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
1ステップで実行できるため、1ステップで実行できます。他の返信を参照してください。
Kaj

2
pdfName.split(".")結果は長さがゼロの配列になります。
アランムーア

1) .エスケープする必要がある\\.
Shri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.