C# で正規表現を適用する必要があります。文字列は次のようになります。
MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII
EVN|A08
PD1
PV1|1|test
そして、私がしたいのは、3文字のみを含むすべての行を削除することです(区切り文字「|」はありません)。したがって、この場合、「PD1」行 (3 行目) を削除する必要があります。これは正規表現で可能ですか?
どうも
This:
(?<![|])[^\n]{4}\n
Regex は、私が使用したオンライン regex テスターで希望するものと一致しましたが、{4}
は実際には であるべきだと思う{3}
ので、うまくいかない場合は切り替えてみてください。
編集:
これも機能\n[^|\n]{3}\n
します。おそらく、探しているものに近いでしょう。
編集2:
番号は括弧で間違いなく{3}
、自宅でテストしました。
以下は、正規表現なしであなたが望むことをします。
String inputString;
String resultingString = "";
for(var line in inputString.Split(new String[]{"\n"})) {
if (line.Trim().Length > 3 || line.Contains("|"))
resultingString += line + "\n";
}
これは、ファイルが 1 つの大きな文字列であることを前提としています。そして、必要な行が削除された別の文字列が得られます。
(または、ファイルを直接使用して実行することもできます:
string[] goodLines =
// read all of the lines of the file
File.ReadLines("fileLocation").
// filter out the ones you want
Where(line => line.Trim().Length > 3 || line.Contains("|")).ToArray();
ファイル内のすべての正しい行を含む String[] になります。)
これを試して:
text = System.Text.RegularExpressions.Regex.Replace(
text,
@"^[^|]{3}(?:\r\n|[\r\n]|$)",
"",
System.Text.RegularExpressions.RegexOptions.Multiline);
正規表現を使用してそれを行うことができます
string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", "");
[a-zA-Z0-9] は任意の文字または数字に一致します {3} は正確に 3 の数字に一致します
^ - 行頭。\w - 単語文字 {3} - 正確に 3 回繰り返されます $ - 行末
^\w{3}$
質問は少しあいまいです。
おっしゃる通り、答えはこんな感じです
(?:^|(?<=\n))[^\n|]{3}(?:\n|$)
これにより、一致に空白が許可されます。
ということでこちら"#\t)"
も削除。
文字を視覚的 (非空白) に制限するには、
(?:^|(?<=\n))[^\s|]{3}(?:\n|$)
which dosent を使用して空白を許可できます。
コンテキストは単一の文字列であり、置換は '' でグローバルです。
perl でのコンテキストの例:s/(?:^|(?<=\n))[^\n|]{3}(?:\n|$)//g
ファイルへのハンドルを取得し、一時的な出力ファイルを作成し、行を 1 行ずつ実行してみませんか。3文字の行がある場合はスキップしてください。ファイルを完全にメモリに保持できる場合は、おそらく GetLines() を使用して(メソッドが呼び出されると思います)、ファイルを1行ずつ表す文字列の配列を取得します。
この正規表現は、除外基準を満たす行を識別し、^[^|]{3}$
すべての行 (データを含む) を反復処理し、除外基準を満たす行を確認するだけです。例えばこんな感じ。
foreach(Match match in Regex.Matches(data, @"^.+$")
{
if (!Regex.IsMatch(match.Value, @"^[^|]{3}$"))
{
// Do Something with legitamate match.value like write line to target file.
}
}
3 人のキャラクターは常に 1 列に並んでいるのですか? その場合は、文字列の先頭/文字列の終わりのマーカーを使用できます。
文字列上に単独で存在する 3 つの文字に一致する正規表現を次に示します。
\A.{3}\z
\A は文字列の先頭です。\z は文字列の末尾です。. 3 回出現する任意の文字 {3}
これまでに投稿されたソリューションからの一般的な観察にすぎません。元の質問には、「3文字しか含まないすべての行を削除してください」というコメントが含まれていました[私の強調]。文字通り「3文字のみ」を意味したかどうかはわかりませんが、そうであった場合は、提案されたソリューションのロジックを次のようなものから変更することをお勧めします
if (line.Trim().Length > 3 ...)
に
if (line.Trim().Length != 3 ...)
...たとえば、2文字の行が実際に有効な場合に備えて。(提案された正規表現ソリューションについても同じ考えです。)