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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

14460閲覧

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

leftyuncleworks

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2015/04/20 02:14

編集2015/04/20 02:32

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

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

変数の内容は abc"\ なってしまいます。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

lang

1static void Main(string[] args) 2{ 3 var htmlList = new List<string>(); 4 htmlList.Add(@"<div style=""padding:10px;"">123.219.218.114</div>"); 5 htmlList.Add(@"<div style=""padding:10px;"">0.0.0.1</div>"); 6 htmlList.Add(@"<div style=""padding:10px;"">nisemono</div>"); 7 htmlList.Add(@"<div style=""padding:10px;""></div>"); 8 htmlList.Add(@"<div style=""padding:10px;"">256.256.256.256</div>"); 9 htmlList.Add(@"<div style=""padding:10px;"">123.0.0</div>"); 10 htmlList.Add(@"<div style=""padding:10px;"">123219218114</div>"); 11 htmlList.Add(@"<div style=""padding:10px;"">255.255.255.255</div>"); 12 13 var result = GetIpList(htmlList.ToArray()); 14 15 if(result.Count != 0) 16 { 17 foreach (var current in result) 18 { 19 Console.WriteLine(current); 20 } 21 } 22 else 23 { 24 Console.WriteLine("なし"); 25 } 26 Console.ReadKey(); 27} 28 29static List<string> GetIpList(string[] htmlList) 30{ 31 const string IPv4Pattern = @"\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?"; 32 var returnValue = new List<string>(); 33 foreach(var current in htmlList) 34 { 35 //need using System.Text.RegularExpressions; 36 var result = Regex.Match(current, IPv4Pattern); 37 if(result.Success) 38 { 39 returnValue.Add(result.Value); 40 } 41 } 42 return returnValue; 43}

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

投稿2015/04/20 06:42

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leftyuncleworks

2015/04/20 08: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 ともかく、本当にありがとうございました。
Tak1wa

2015/04/20 08:17

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

0

こんにちは。

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

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

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

投稿2015/04/20 04:19

編集2015/04/20 04:21
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leftyuncleworks

2015/04/20 05: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歳を過ぎていると再就職は極めて困難です。 若い皆様、健康は宝です。 どうか激務で体を壊さないで欲しいと心底思います。 プライベートな件、並びに長文、大変失礼いたしました。
leftyuncleworks

2015/04/20 05: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;\\\"\\> 多分相当トンチキなコードを書いている気がしてなりません。 ネッ上には高度で難解ななコードがあふれていますが、逆に稚拙なコードは見つからないものですね。
guest

0

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

lang

1string s = "abc" + @"""";

となります。

@を使用しない場合は

lang

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

と書けます。

二つ目の

lang

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

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

投稿2015/04/20 02:47

編集2015/04/20 02:53
makiikeda1216

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leftyuncleworks

2015/04/20 04: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 ); } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問