- 締切済み
C#での正規表現について
C#3.5を使用しています。 左側が FOREIGN KEY (` で右側が `) に囲まれた間にある文字列を取得するためには どのようにすれば良いのでしょうか? 英数字だけでなく日本語も対象(つまり `) 以外全部)になります。 例えば、 FOREIGN KEY (`order_no`) や FOREIGN KEY (`注文番号`)なら order_no や 注文番号 を取り出したいです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
かっこの対応をとらなくていいなら正規表現は使わなくてもいいし, とらなければならないなら正規表現は使えない. 正規表現を使うなら, FOREIGN KEY(`(.*)`) のようなものでマッチさせることになります.
- D-Matsu
- ベストアンサー率45% (1080/2394)
それってわざわざ正規表現パターン使う必要ありますか? 文字列"FOREIGN KEY(`"を探して、そこから"`)"までの部分文字列をsubstring()か何かで切り出せばいいように思えますが。
お礼
ご返答ありがとうございます。 なるほど、たしかに次のようにして string sql = " CONSTRAINT `fk_1` FOREIGN KEY (`order_no`) REFERENCES `order_main` (`order_no`) ON DELETE CASCADE"; string startMatch = "FOREIGN KEY (`"; string endMatch = "`)"; int start = sql.IndexOf(startMatch) + startMatch.Length; int end = sql.IndexOf(endMatch, sql.IndexOf(startMatch) + startMatch.Length); System.Windows.Forms.MessageBox.Show(sql.Substring(start, end - start)); 結果は得られたのですが、正規表現ならもう少し簡潔なやり方でできるのかなぁと思いまして。ん~どうなんだろう
お礼
ご返答ありがとうございます。 >かっこの対応をとらなくていいなら正規表現は使わなくてもいいし, とらなければならないなら正規表現は使えない これをもう少し具体的に説明してほしいのですが、 試してみたのですがこういうことでしょうか? 次の () なしの場合は order_no が得られたのですが string sql = "FOREIGN KEY `order_no`";// ← ()なし string match = "FOREIGN KEY `(?<foreign_key>.+?)`";// ← ()なし var reg = new System.Text.RegularExpressions.Regex(match, RegexOptions.IgnoreCase | RegexOptions.Singleline); for (System.Text.RegularExpressions.Match m = reg.Match(sql); m.Success; m = m.NextMatch()) { System.Windows.Forms.MessageBox.Show(m.Groups["foreign_key"].Value); } 次の () ありの場合は得ることができませんでした。 string sql = "FOREIGN KEY (`order_no`)";// ← ()あり string match = "FOREIGN KEY (`(?<foreign_key>.+?)`)";// ← ()あり エスケープすればいいのかな?と思って次のようにしたらorder_no が得られました。 string sql = "FOREIGN KEY (`order_no`)"; string match = @"FOREIGN KEY \(`(?<foreign_key>.+?)`\)"; こういうことではないのでしょうか?