- 締切済み
(C#)1バイトの正規表現
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- oldroot2005
- ベストアンサー率66% (68/103)
問題点、理解できました。 .NET では、1文字==2バイトですから、1バイトにマッチする正規表現というのはありえません。 また、バイナリデータを string に読み込むと、指定した encoding によっては変換されるため、ファイル中で 100 バイトだったデータが、string で 100 文字になるとは限りません。したがって、Regex.Replace や Substring でバイナリデータの部分を捨てることもできません。 結局のところ、いったん string に読み込んでしまったら、どうにもならない、ということです。ファイルから読み込む時点で、バイナリデータの部分をスキップするのが妥当な方法でしょう。以下は例です。 using System; using System.IO; using System.Text; using System.Text.RegularExpressions; class ReadData { static void Main() { char [] buf; FileStream fs = new FileStream("data.dat", FileMode.Open); Encoding enc = Encoding.GetEncoding("shift-jis"); BinaryReader br = new BinaryReader(fs, enc); br.BaseStream.Seek(100, SeekOrigin.Begin); // 100 バイトスキップ buf = br.ReadChars((int)(br.BaseStream.Length-br.BaseStream.Position)); br.Close(); string str = new string(buf); // string に変換する必要があれば Console.WriteLine(str); } }
- oldroot2005
- ベストアンサー率66% (68/103)
まず根本的な話なのですが、「先頭の100バイト」とはどのような意味でしょうか。.NET では文字コードは UNICODE ですから、とりあえずサロゲートペアを度外視すれば、1文字==2バイトです。したがって、馬鹿正直に解釈すれば、「先頭の100バイト」は「先頭の50文字」という意味になります。もしそうなら、 Regex.Replace(Buffer,"^[\u0000-\uffff]{50}","",RegexOptions.Singleline) あるいは、単純に Regex.Replace(Buffer,"^.{50}","",RegexOptions.Singleline) となります。しかし、わざわざ Regex を使わなくても、 Buffer.Substring(50) で目的は達せられます。 もし、Buffer の中身が Shift-JIS コードだと考え、いわゆる半角文字==1バイト、いわゆる全角文字==2バイトとして、「先頭100バイト」と言っておられるのなら、No.1 さんの方法で Shift-JIS に変換しなければなりません(Encoding に Shift-JIS が指定できるとしての話ですが)。 その場合、100バイト目に2バイト文字の1バイト目が来てしまったときの処理をしなければならないので、単純には行かないと思います。
補足
馬鹿正直に100バイトです。 説明し忘れましたが、バイナリファイル「っぽい」ファイルを開いていまして、Shift-jisの文字列の前に、正体不明のバイナリ値が100バイトあるのです。 というわけで、提示いただいた正規表現は使えません。 というより、正規表現では無理なのかな?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
"^[\x00-\xff]{100}" は、マルチバイト文字列にはマッチしないようです。 #1さんのようにすればいいと思います。
- SpiralGalaxy
- ベストアンサー率39% (649/1652)
C#はやったことないんですが Javaだとこれでいきます。 String kotae = buffer.replaceFirst("^.{100}", ""); Javaは全部ユニコード操作なので1バイト文字、2バイト文字での操作の違いというのは無く、C#でその辺りが問題になるのなら、駄目かもしれません。
お礼
C#もUnicodeらしいのですが、何だかよくわかりませんね。
- osamuy
- ベストアンサー率42% (1231/2878)
本当に100バイトずつ削除したいなら、いったんGetByes()で、バイト配列に変換してから、操作してみては。
お礼
うーん それしかないのかな…。 できれば正規表現で何とかしたいのですが…。
関連するQ&A
- 正規表現 C#
こりんご様、皆様 ご回答ありがとうございます。 でもまだ、私の理解力が足りず、応用が利かないのでまた質問させて下さい。 以下のページの176行目 http://my.chiebukuro.yahoo.co.jp/my/myspace_quedetail.php?writer=sescode7689 ↓この部分を正規表現で取得したいので "yj-guid" この様に書いて見ました。↓ Regex re = new Regex(@"<span class=(?<hiduke>.+?)>現在位置", RegexOptions.Singleline); でも取得できないのです。 どの辺りが違うのでしょうか? 教えて下さい。 応用力を付けたいです。 宜しくお願いします。
- 締切済み
- Visual Basic
- 正規表現で置換したい
ブログのシステムを変更して、 記事中にある内部リンクの書き換えが必要となりました。 現在、記事中に post-001.html post-005.html ・ ・ ・ post-853.html という文字列があります。 数字は飛び飛びでそれぞれ異なり500個ほどあります。 WordPressのプラグインの「Search Regex」を使って置換をしたいのですが、 正規表現で置換して、 ハイフンをアンダーバーに置換し、お尻の「.html」は削除して post_001 post_005 ・ ・ ・ post_853 としたいのですが、正規表現で置換する場合、 どのようにすればいいのでしょうか。 「post-」を ( ) でくくればいいのでしょうか。 「.html」削除するにはどうすればいいのでしょうか。 Search Regex に Search pattern(置換前の文字列)と Replace pattern (置換後も文字列)を入力する欄があります。 上のような文字列を置換したい場合は、 それぞれどのような記号を入力すればよいのでしょうか。 アドバイスをよろしくお願いいたします。
- ベストアンサー
- Perl
- 正規表現を使った置換処理。大文字の直前に「_」を入れたい
正規表現を使った置換処理です。 大文字の直前に「_」を入れたいと思っています。 例:htmlLinkStr → html_Link_Str WSHとして以下のようなコードを1行記述しました。 WScript.Echo("htmlLinkStr".replace(/([A-Z]+)/g, "_" + RegExp.$1)); しかし「html_ink_tr」としょぼい結果しかえられません。 「RegExp.$1」の使い方が悪いのかもしれません…。 ちなみにVBSでは以下のコードで成功しています。 ので大きくはずしてはいないと思うのですが… Set regEx = New RegExp regEx.Pattern = "([A-Z]+)" regEx.Global = True MsgBox regEx.Replace("htmlLinkStr", "_$1") JavaScriptでの正規表現の使い方に詳しい方よろしくお願いします。
- ベストアンサー
- JavaScript
- 正規表現での置換えについて
正規表現を使った置換えでどうやったらいいのか悩んでいます。 やり方は、カンマで区切られた数字や英字の列をその先頭だけ残して別の記号(?など)に変換するというものです。 変換例 222,1,33333 は 2??,1,3???? へ置換え 55,22aa は 5?,2??? へ置換え 6 は 6 へ置換え(つまりそのまま) このような置換えをすることは可能でしょうか。 こういう置換えはand条件が使えないと無理なのかなとも思ったりしています。 ただ正規表現にはand条件は無いようですし。(or条件はあるようですが) mb_ereg_replaceを使って明示していただけると助かります。 もちろん複数行になっても問題ありませんし、mb_ereg_replaceでは無理という場合に別の関数を使っていただいても結構です。 よろしくお願いします。
- ベストアンサー
- PHP
- 正規表現で置換
正規表現の初心者です。 テキストエディタを使って、「@:」で始まる以外の行の先頭に「//」を挿入してコメントアウトしたいのですが、正規表現がうまく書けません。 検索対象: ^[^(@:)] 置換文字列: // でいいのかなと思ったのですが、[]の中ではグルーピング用の()も文字として認識されてしまうのですね。 どのように書いたら正しく置換されるでしょうか。 どうかご教示ください。
- ベストアンサー
- その他([技術者向] コンピューター)
- 正規表現のタイプがわからない(初心者)
正規表現で置換ができることを知り、こういうサイトを見つけました。 @IT:Windows TIPS -- Tips:複数ファイルの文字列置換をワンクリックで行なう http://www.atmarkit.co.jp/fwin2k/win2ktips/308strrpl/strrpl.html そこでreplace.wsfを作りましたが、正規表現がうまくいきません。 replace.wsfは正規表現を使う場合は "/ /g" で囲うらしいのですが urlのようなスラッシュ / が多いものを円記号 \ でエスケープしましたがうまくいきません。 さらに http://msdn.microsoft.com/ja-jp/library/aa293063(VS.71).aspx というサイトで任意の文字をドット . で置換したいんですができません。 以下書いたものを載せます 文字はアンダーバー _ で書いています strRepl="/http:[\/][\/]______.____.jp[\/]____/____[\/][0-9][0-9][0-9][0-9][\/][0-9][0-9][\/][0-9][0-9]/g"; /* 置換対象文字列 */ [\/]はかっこなしでも試しましたができませんでした [0-9]の部分は年月日が入ります。 replace.wsfで正規表現を実現させることができません。 正しい方法を教えてください!!
- ベストアンサー
- Windows Vista
- 正規表現について教えてください。
正規表現について教えてください。 JavaScriptでプログラミングを行っています。 その中で文字列に対しゼロサプレスを行いたいと思い 調べた結果、正規表現を使用する以下のコードで 実現可能なことが分かりました。 val.replace(/^0+([0-9]+.*)/, "$1") コードを記述し実行すると確かに可能なのですが 正規表現を調べてみても何故これでゼロサプレスが可能なのか よく理解できませんでした。 申し訳ありませんが初心者でも理解できるように説明して頂けないでしょうか。 宜しくお願いします。
- ベストアンサー
- JavaScript
- 正規表現を使用しない置換方法で giオプション
正規表現を使用せず文字列を置換したいと思っています。 (文字列.replaceはOKだが引数で正規表現は使用せず、単純置換のみ) その際、以下を満たす置換方法はありますか? 1.大文字小文字区別せず 2.検出した箇所すべて 例えば 文字列.split("検出文字列").join("置換文字列") のような方法であれば、2は満たせますが、1が満たせません。 ご回答お待ちしております。
- ベストアンサー
- JavaScript
- 正規表現 ""で囲まれた内部は処理しない方法
正規表現でタグ内の項目内容に""をつける処理を考えています。 現在は、= の右側にある内容を""で囲む処理をしています。 C#で書いたコードは次ような感じです。 text = Regex.Replace(text, "(\\S)=([^\"' >]+)","$1=\"$2\"" ,RegexOptions.Singleline); このときに次のようなHTMLコードがあった場合、 <div id=000 class="tayp1,type2"> <div id="111" class=type1> <img src="200.gif" alt="100+100=200"> すると次のような結果になります。 <div id="000" class="tayp1,type2"> <div id="111" class="type1"> <img src="200.gif" alt="100+100="200""> 3行目はalt内にも=があるため間違った処理をしてしまいます。 誤:alt="100+100="200"" このような""内部は処理しないようにするにはどうすればよろしいでしょうか? ""内部の=にはヒットしななれば…と思っているのですが。 よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
お礼
確かにできそうにありませんね。 おとなしくバイト配列に読み込んで処理することにします。