質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

C# ダブルクォーテーションの文字列の連結で「\」が入ってしまいます。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 12K+
昨日からVisual Studio 2013 Express Desktop で C# を勉強し始めましたビギナーです。
下記のコードで双方最後に「\」が付いてしまいます。
多分、ものすごく基本的なことを理解していないからだと思いますが、ネットで検索してもこのような事例と回避方法見当たりません。
賢者のみなさま、稚拙な質問で申し訳ございませんがご教授よろしくお願いします。

string s = "abc" + @""";
string s = "abc" + Microsoft.VisualBasic.Strings.Chr(34);

変数の内容は abc"\ なってしまいます。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

少し方向性が変わりますが、IPアドレスをHTMLから検索するのであれば
正規表現を使うほうが良い気がします。

static void Main(string[] args)
{
    var htmlList = new List<string>();
    htmlList.Add(@"<div style=""padding:10px;"">123.219.218.114</div>");
    htmlList.Add(@"<div style=""padding:10px;"">0.0.0.1</div>");        
    htmlList.Add(@"<div style=""padding:10px;"">nisemono</div>");       
    htmlList.Add(@"<div style=""padding:10px;""></div>");               
    htmlList.Add(@"<div style=""padding:10px;"">256.256.256.256</div>");
    htmlList.Add(@"<div style=""padding:10px;"">123.0.0</div>");        
    htmlList.Add(@"<div style=""padding:10px;"">123219218114</div>");   
    htmlList.Add(@"<div style=""padding:10px;"">255.255.255.255</div>");

    var result = GetIpList(htmlList.ToArray());

    if(result.Count != 0)
    {
        foreach (var current in result)
        {
            Console.WriteLine(current);
        }
    }
    else
    {
        Console.WriteLine("なし");
    }
    Console.ReadKey();
}

static List<string> GetIpList(string[] htmlList)
{
    const string IPv4Pattern = @"\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?";
    var returnValue = new List<string>();
    foreach(var current in htmlList)
    {
        //need using System.Text.RegularExpressions;
        var result = Regex.Match(current, IPv4Pattern);
        if(result.Success)
        {
            returnValue.Add(result.Value);
        }
    }
    return returnValue;
}

「C# 正規表現」とかで検索して見てください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/20 17:07

    Tak1waさん、こんなに丁寧にご回答いただきありがとうございます。
    const string IPv4Pattern = @"\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?";
    var result = Regex.Match(current, IPv4Pattern);
    if(result.Success)
    これだけでIPv4形式の判定ができるなんて便利です。
    教えていただいたコードは(試していないので多分)タブが入っていようが、いろんなタグ文字列が入っていようが、IPv4フォーマットの文字列があるかどうかを判定して、値を返してくれる関数?(メソッド?)なのですね。
    こういうコードをみると技術確認のスピードがとてつもなく速く感じてしまいます。
    C#って方がガチガチって聞いていたのですが var ってあるのですね、でも
    var returnValue = new List<string>();
    って、意味がよくわかりません。<stromg>なのになぜ var なのか?
    Listだから?
    まぁ、ビギナーはこういうことは深く考えないがうが良いということですね。
    Listは大昔(20年くらい前、必要があって C でで実装したことがあります。
    添え字(インデックス)を操作しなくでも値をaddして、連続でFIFO/LIFO出来たりする関数。
    ともかく、とても勉強になりました。
    教ええていただいたコードは理解できました、もちろん、この方法論は自分で見つけることはできないけど。
    本当にやりたいことはCTUからグローバルIPアドレスを取得する事です。
    uPnP(COM)で出来るようでして、いくつかサンプルがありましたが、私の場合無線のAPが噛んでいるせいかさっぱり動作せず、グローバルIPアドレスを返してくれるウェブサイトにPOSTしてHTMLからグローバルIPアドレスを引っこ抜こうと考えたわけです。
    これも紆余曲折がありましてなぜだかEUC-JPだとエンコ出来ずにバケバケになるサイトばかりで、ようやくみつけたのが
    https://www.cman.jp/network/support/go_access.cgi
    です。

    P.S.
    Javaですけどこんなこともできるのですね。
    C#でもできるのかな?
    http://qiita.com/arai-wa/items/0cefd78f6e4a5b5128dc

    ともかく、本当にありがとうございました。

    キャンセル

  • 2015/04/20 17:17

    > って、意味がよくわかりません。<stromg>なのになぜ var なのか?
    少しづつで良いと思います。
    慣れたら、「C# 型推論」と「C# ジェネリック」で検索してみてください。

    キャンセル

+1

こんにちは。

ウォッチ上の問題であれば、ウォッチ上の文字列はエスケープされます。
なので「abc\"」("\ではなく\"ですよね?)と表示されるのは正常です。

画面やコンソールに表示される際には想定どおり表示されるはずです。

ためしにパスなどを取得してウォッチで見てみると、「C:\\HogeHoge\\PiyoPiyo」などとエスケープされているのがわかると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/20 14:31

    ありがとうございます。
    ここのウェブサイトは素晴らしいですね。
    かっという間に閲覧者が100名を超え、早速お二人の先輩からご回答をいただき感激しております。
    質問を簡素化しすぎたようです。
    やりたいことはhtmlを1行ごとに文字列配列に格納された状態で、そこからある条件にヒットした行からIPアドレスを取り出だすと言うものです。
    文字型変数に格納されている文字列をIndexOfで検索するため、検索用文字列にダブクォーテーションとセミコロンを含む文字列を生成するのに以下のようなコードを書いたのですがIndexOf()の戻り値がー1になります。

    配列変数に入っている文字列。
    ウォッチ式表記です。(実際の変数地のバックスラッシュは半角)
    sCsv[137] = \t\t\t<<div style=\"padding:10px;\">123.219.218.114</div>

    // <div style=\"padding:10px;\"> の文字列を生成する。
    string sSerchString = "<div style=" + @"\" + Microsoft.VisualBasic.Strings.Chr(34) + "adding:10px" + Microsoft.VisualBasic.Strings.Chr(59) + @"\";
    sSerchString = sSerchString + Microsoft.VisualBasic.Strings.Chr(34) + ">";
    int p = sCsv[137].IndexOf(sSerchString,1);
    if (p > 0)
    {
    //IPアドレスを取り出す。
    }

    当方、つい最近病気を理由に解雇された50歳の初老のエンジニアです。
    今どきのIT技術者の求人はWEBシステムオンリーですね。(いわゆるLAMPとかフルスペックとか)
    WEBシステムはさんざん設計しましたけど実装は中国にお任せしていたのでここ15年、コードは書いていません。(昔はCとVB(Ver4.x)で死ぬほどコード書きましたけど...)
    履歴書に「独学ながらC#.Java,PHP」って書きたいので求職中の今、勉強しております。
    もちろん実務で経験されてきた諸先輩方にかなうはずもなく、悪あがきではありますが何もしないよりは少しはマシと思い勉強しています。
    個人的なことは書くべきではないとは思っておりますが、こういった深刻な気持ちで勉強している初老の人間もいるということを言いたくて書いてしまいました。
    上級のPM,PLエンジニアでも40歳を過ぎていると再就職は極めて困難です。
    若い皆様、健康は宝です。
    どうか激務で体を壊さないで欲しいと心底思います。
    プライベートな件、並びに長文、大変失礼いたしました。

    キャンセル

  • 2015/04/20 14:48

    生成式が間違っていました。

    string sSerchString = "<div style=" + @"\" + Microsoft.VisualBasic.Strings.Chr(34) + "padding:10px" + Microsoft.VisualBasic.Strings.Chr(59) + @"\";
    sSerchString = sSerchString + Microsoft.VisualBasic.Strings.Chr(34) + @"\" + ">";

    しなしながら sSerchString のウォッチ式が以下の値ですのでIndexOf()でヒットする訳がないと思っています。

    sSerchString = <dev style = \\\padding:10px\\\10px;\\\"\\>

    多分相当トンチキなコードを書いている気がしてなりません。
    ネッ上には高度で難解ななコードがあふれていますが、逆に稚拙なコードは見つからないものですね。

    キャンセル

0

""の前に@をつけると\\を\としてエスケープを省略することができるので文字列がパスだった場合、見やすくなったりして便利なのですが、@""の中に " が含まれていた場合は "" とエスケープしてあげる必要があるのでそのコードを書くと

string s = "abc" + @""""; 
となります。

@を使用しない場合は

string s = "abc" + "\""; 

と書けます。

二つ目の
string s = "abc" + Microsoft.VisualBasic.Strings.Chr(34); 

は試してみましたが\は私の環境では付きませんでしたので実装したコードを見てみたいです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/20 13:06

    早速のご回答ありがとうございます。
    ソースコードの抜粋は以下の通りです。
    変数 s をウォッチ式で参照すると abc"\ となります。
    ブログ経由でプロジェクトをレンタルサーバーにアップロードしました。
    お時間がありましたら見ていただけますでしょうか?
    よろしくお願いします。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using Microsoft.VisualBasic;

    namespace DQ
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    string s = "abc" + Microsoft.VisualBasic.Strings.Chr(34);
    MessageBox.Show( s );
    }
    }
    }

    キャンセル

  • 2015/04/20 13:08

    失礼しました、ブログのurlを書き漏れでいました。
    短縮で
    http://u111u.info/k8HZ
    です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る