2

私の問題に対する正確な答えが見つかりません。これはクリーンアップする文字列です:

2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44
2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7
2012/04/21 21:48:34 76C00790 BB 94 85 3D F7 AE 9E 9A DB 21 06 D7 BF 02 3A EB
2012/04/21 21:48:34 76C00790 1D 37 56 DA 6D 03 1E 10 3E F8 F8 EC 23 0B 63 62
2012/04/21 21:48:35 76C00790 49 29 B4 A7 4B 16 F5 94 73 89 4C 33 88 1E AC FB
2012/04/21 21:48:35 76C00790 DC A3 B5 D2

上記の文字列を貼り付けてonkeyup、テキストエリア フィールドのイベントでクリーンアップする必要があります。

CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44
E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7
BB 94 85 3D F7 AE 9E 9A DB 21 06 D7 BF 02 3A EB
1D 37 56 DA 6D 03 1E 10 3E F8 F8 EC 23 0B 63 62
49 29 B4 A7 4B 16 F5 94 73 89 4C 33 88 1E AC FB
DC A3 B5 D2

新しい各行の最初のブロックは常に日付で、2 番目は常に時間ですが、3 番目のブロックの長さは異なる場合があります。

したがって、合理的な区切り文字はスペースだと思いますが、すべての行から最初の 3 ブロックを削除して残りを残すにはどうすればよいでしょうか?

編集

助けてくれてありがとう!したがって、これは実際の例です (最新の FF でテスト済み):

<html>
<head>
<script language="javascript">
<!--
function clean(input) {
 input.value = input.value.split("\n").map(function(entry) {
  return entry.replace(/^\d+\/\d+\/\d+ \d+:\d+:\d+ [A-F0-9]+ /, "");
 }).join("\n");
}
-->
</script>
</head>
<body>
 <textarea id="f" cols="80" rows="7"  onkeyup="javascript:clean(this);"></textarea>
</body>
</html>
4

5 に答える 5

2

おお!これは、String.splitArray.map、およびArray.join. 私はいつもこの種のことをしています:

data = data.split("\n").map(function(entry) {
  return entry.replace(/^\d{2}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} [A-F0-9]+ /, "");
}).join("\n");
  • String.split部分文字列または正規表現に基づいて文字列を配列に分割します(私たちにとっては、\n
  • Array.map配列内の各要素に対して関数を実行し、関数の戻り値の新しい配列を返します
  • Array.join配列を文字列に結合します(この場合、\n

編集:おそらくentry.substr(29)、その正規表現の代わりに使用することもできます。 false: 質問は、取り除く 3 番目のブロックが可変長であると明確に述べています。

ダブル編集:あなたの場合、他の人が示したように、代わりにストレート正規表現を使用することができます。ただし、もっと複雑なこと (大文字と小文字の変換、サニタイズなど) を行う必要がある場合は、.split().map().join()ダンスは簡単になると思います。

トリプル編集:上位2つの回答のパフォーマンスの比較をここにまとめました. そこから好きな結論を導き出してください。

于 2013-06-27T07:23:19.770 に答える
2

非正規表現ソリューションは次のとおりです。

var str = "2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44\n2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7";

var str = str.split("\n");      // Split the string into an array on newlines
for(var i = 0; i < str.length; i++) {
    str[i] = str[i].split(" "); // Split the string into an array on spaces
    str[i].splice(0, 3);        // Remove the first 3 blocks
    str[i] = str[i].join(" ");  // Join the array into a string with spaces

    alert(str[i]);              // CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44
}

JSFiddle のデモを次に示します

76C00790ブロックも保持したい場合は、 で に変更32ますsplice


@bozdoz のおかげで、これは短いバージョンです。

var str = "2012/04/21 21:48:33 76C00790 CE 49 AC FD 37 EB 58 05 11 31 9F 8B 36 38 59 44\n2012/04/21 21:48:34 76C00790 E9 6F 24 88 AB C8 18 63 FA 1E A8 1C 6A DB D2 A7";

var str = str.split("\n");
for(var i = 0; i < str.length; i++)
    alert(str[i].split(' ').splice(3).join(' '));
于 2013-06-27T07:24:41.030 に答える
1

正規表現の分割を行います:

var arr = str.split(/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} .*? /g);
arr.shift(); //get rid of the first empty match

正規表現は日付をチェックします: yyyy/mm/dd、次に 2 桁 : 2 桁 : 2 桁、そしてスペースまでの任意の文字。フラグは、正規表現がグローバルに検索することを意味しますg(最初の一致後も文字列を検索し続けます)。

arr各行の配列になりました。テキスト ボックスに入れるには、 で複数行の文字列に戻すことができますarr.join('\n')

于 2013-06-27T07:28:09.523 に答える
0

1 つの文字列であることを考慮して、次の RegEx を使用します。

str.replace( /\d{4}\/.{24}/g ,"");

JSFiddle のデモを次に示します

于 2013-06-27T07:23:47.690 に答える
0
myTextArea.value.replace(/(^|\n)\S+ \S+ \S+ /g, "$1")
于 2013-06-27T07:23:51.393 に答える