1

最初の 2 つのパイプのペアの間の次のツイートから情報を抽出したいと思います。

"TRV_Insurance" || "Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" || "en" || "Wed, 04 Apr 2012 14:27:24 +0000" || NH || South Tamworth

つまり、「最近の TX の悪天候の影響を受けたトラベラーのお客様は、800.252.4633 またはhttp://t.co/NK4z2EpQ #tornadoでオンラインで損害を報告できます」のみが必要です。

この情報は、パイプの最初の teo ペアの間にあります。最初の 2 つを除く他のすべてのパイプを除外したい。出来ますか。

私の正規表現

(?<=||)(.*?)(?=||)

最初の 2 つの "||" を含める方法がわかりません そして他人を無視します。

ありがとう

4

6 に答える 6

1

あなたはそれを頑張りすぎていると思います。正規表現は非常に難しい場合があります。

アイデアとして、あなたのデータは確実に構造化され、区切られているように見えるので、その区切り記号で分割してみませんか?

以下は、Javascript を使用した実際の例です。分割関数は似ていて、使用しているどのプログラミング言語でも利用できるはずだと思います。

http://jsfiddle.net/T8E3g/

于 2012-08-01T07:38:33.340 に答える
1

あなたの正規表現では、 | をエスケープしていません。そのため、OR 演算子として機能します。正しい正規表現は次のようになります。

(?<=(\|\|)(.*?)(?=(\|\|))
于 2012-08-01T07:18:29.237 に答える
1

このようなものが私のために働いた:^.*?\|\|(.+?)\|\|. 正規表現言語では、パイプは特殊文字 (OR演算子を表す) であるため、エスケープする必要があります。最初の 2 つを照合する必要があるため、前方アンカー ( ^) を追加すると、文字列の先頭から照合を開始するよう正規表現エンジンに指示されます。

その後、グループを使用して、パイプ間のコンテンツにアクセスできます。

私はJavaでそれを試しました:

Pattern p = Pattern.compile("^.*?\\|\\|(.+?)\\|\\|");
String str = "\"TRV_Insurance\" || \"Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado\" || \"en\" || \"Wed, 04 Apr 2012 14:27:24 +0000\" || NH || South Tamworth";

Matcher m = p.matcher(str);
if (m.find())
{
    System.out.println(m.group(1));
}

収量:

"Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado"
于 2012-08-01T07:20:13.877 に答える
0

perl regex は ibm aql で受け入れられます。

「拡張」正規表現の場合、「|」などの特殊文字をエスケープする必要はありません ただし、他の非特殊文字はエスケープする必要があります。したがって、リテラル パイプはエスケープされます。

このような正規表現は一致するはずです:

^([^\|]+\|)*\|([^|]*)

次に、2 番目の後方参照で、必要な文字列が得られます。

于 2012-08-01T07:38:47.430 に答える
0

どの言語を使用していますか?

次のようなパターンを使用できます。

[^|]+

|| の間のすべてを一致させてから、文字列を抽出します。

たとえば、javascript では次のようになります。

var string = '"TRV_Insurance" || "Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" || "en" || "Wed, 04 Apr 2012 14:27:24 +0000" || NH || South Tamworth';

var array = string.match(/[^|]+/g);

array[1] はあなたの答えです;-)

[編集]; 配列を使用できない場合は、次を試してください。

(?<=([^|]\|\|))[^|]+

グローバルフラグなし。このパターンは、最初の文字列と || に対して正の後読みを使用し、|| でない限りすべてをキャッチします。

[編集]; 入力データに「|」が含まれている場合の問題を回避するため:

(?<=([^|]\|\|)).+?(?=(\|\|))
于 2012-08-01T07:18:02.773 に答える
0

次の正規表現を使用します。

(?<=(\|\|)|^)(.*?)(?=(\|\|)|$)

于 2012-08-01T07:15:37.043 に答える