0

ここでの問題は、文字列の一部で文字を削除したいのですが、削除を制限する方法がわからないことです。

例:

A computer is a general purpose device that can be\n
programmed to carry out a finite set of\n 
millions to billions of times more capable.\n
\n
In this era mechanical analog computers were used\n
for military applications.\n
1.1 Limited-function early computers\n
1.2 First general-purpose computers\n
1.3 Stored-program architecture\n
1.4 Semiconductors and\n

この例は私の文字列の内容です。私がしたいのは、\n上記の行 1 と 2 を削除することですが\n、行 5 以降を削除することではありません。もう一方を削除せずに を削除するにはどうすればよいですか? \n\n. ここでの私の目標は、\n行の後に文字列を段落にすることです。例のように、最初の 3 行を段落にして、次の行を箇条書きにすることができます (例)。私が言いたいのは\n、箇条書きの文字を削除したくないということです。

文字列の実際の内容は動的です。

私はString.replaceAll("\n", " ")うまく機能しないことを明確に試してみましたが、何が英数字であるかを判断するため\nに使用することを考えていたすべてを削除しますが、その後いくつかの文字を削除しますRegex\n

4

2 に答える 2

10

この正規表現を使用してみてください:-

str = str.replaceAll("(.+)(?<!\\.)\n(?!\\d)", "$1 ");
System.out.println(str);

これは、箇条書きが後に続く場合に、それが。であり、それがである場合\nにあなたを置き換えます。(たとえば、最初の箇条書きの後にはが続きます。したがって、置き換えられません。)not precededdot - termination of a paragraphnot followeddigit\n1.2

  • (.+)最初に、を置き換えていないことを確認しますblank line

これは、表示した文字列に対して機能します。

説明: -

  • (.+)->キャプチャグループ。何かをキャプチャし、少なくとも1回は発生します。

  • (?<!\\.)->これはと呼ばれnegative-look-behindます。その文字列の前にパターン内の指定stringがない場合にのみ、次の文字列と一致します。例:-次の行の後に置き換える必要はありません:- 。dot(.)negative-look-behind
    \nmillions to billions of times more capable.\n

  • (?!\\d)->これはと呼ばれnegative -look-aheadます。その文字列の後にパターンでdigit (\\d)指定された文字列が続かない場合にのみ、背後の文字列と一致します。例:-箇条書きでは、の後に。が続きます。ここで、は数字です。だから、あなたはそれを置き換えたくありません。negative-look-ahead
    computers\n1.21\n

  • ここで、パターンマッチでキャプチャされたグループ$1を表します。$2交換したいだけなので"\n"。そこで、残りのパターンマッチをそのまま取り、。に置き換え"\n"ましたspace

だから、-$1の表現です1st group(.+)

注意してください、look-aheadそしてlook-behind正規表現はnon-capturingグループです。

詳細については、次のリンクをたどってください。

于 2012-11-05T09:46:24.733 に答える
2

あなたの要件は、 1 行目と 2 行目の \n を削除することだと思います。
できることは以下の通りです。

  • 文字列をセグメントに分割し、

  • String[] 配列 = yourString.split("\n");

  • \n タグを追加して、1 行目と 2 行目を除くすべてのセグメントを連結します。

  • 配列[1] + 配列[2] + 配列[3] + '\n' + 配列[4] + '\n' ...// など

于 2012-11-05T09:41:07.247 に答える