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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

582閲覧

C#での正規表現による文字列の抽出について

cesolution

総合スコア217

C#

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/02/05 02:31

前提・実現したいこと

C#で現在、与えられた化学式の中から、原子数をカウントしようとしています。
例えば"C16H34O"といった化学式が与えられた場合、Cの数が「16」、Hの数が「34」、Oの数が「1」といった情報を取得する必要があります。

発生している問題・エラーメッセージ・現状のコード・試したこと

当方正規表現の使い方に慣れておらず、インターネット等で調べながら、ひとまず例えばC16の部分を抜き出すには以下のような記載をすれば良いことは分かりました。

C#

1MatchCollection cnum = Regex.Matches(Formula, "C[0-9][0-9]");

上記コードでC16H34Oを渡してやると、C16の部分が抜き出せるため、後はCでsplitしてやればCの数が16と得られそうです。
しかし、例えばCH4O等を渡した場合は、パターンがC[0-9][0-9]ではなく、C[0-9]となるため、上記のパターンでは抽出することができません。
以下のように複数のケースを作っておけば、それぞれ抽出できるのですが、もう少しスマートなやり方がないかなと思い質問させていただいております。 (以下と同様のことをH、O、N等様々な原子種についても行おうとすると平坦で長いコードになってしまうので、、、)

C#

1MatchCollection cnum = Regex.Matches(Formula, "C[0-9][0-9]"); 2MatchCollection cnum2 = Regex.Matches(Formula, "C[0-9]"); 3MatchCollection cnum3 = Regex.Matches(Formula, "C");

専門の方のお知恵をお貸しいただけると大変有難いです。

宜しくお願いいたします。

補足情報(FW/ツールのバージョンなど)

visual studio2019

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

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

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

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

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

guest

回答2

0

MatchCollection cnum = Regex.Matches(Formula, "C[0-9]{0,2}");
で、C,C9,C99が取得できます。
MatchCollection cnum = Regex.Matches(Formula, "[C|H|O|N][0-9]{0,2}");
C,H,O,Nのものが取得できます。

投稿2020/02/05 02:59

Y.H.

総合スコア7918

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

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

cesolution

2020/02/05 03:11

ご連絡ありがとうございます。[0,2]という使い方ができるんですね、大変勉強になりました。
Y.H.

2020/02/07 09:29

[0,2] ではなく {0,2} です。 直前の文字が0~2個存在するという条件です。
cesolution

2020/02/10 04:45

Y.H.さん、補足していただきありがとうございます。
guest

0

ベストアンサー

次を試してみてください。

C#

1using System; 2using System.Linq; 3using System.Text.RegularExpressions; 4 5namespace ConsoleApp1 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 var input = args.Length > 0 12 ? args[0] 13 : "CH4O"; 14 var elements = Regex 15 .Matches(input, @"([A-Z][a-z]?)(\d*)") 16 .OfType<Match>() 17 .Select(a => new 18 { 19 Name = a.Groups[1].Value, 20 Count = string.IsNullOrEmpty(a.Groups[2].Value) ? 1 : int.Parse(a.Groups[2].Value) 21 }); 22 foreach (var element in elements) 23 { 24 Console.WriteLine($"元素名: {element.Name}, 数: {element.Count}"); 25 } 26 } 27 } 28}

投稿2020/02/05 02:58

Zuishin

総合スコア28669

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

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

cesolution

2020/02/05 03:10

早速のご回答ありがとうございました。ご連絡いただいたコードでやりたいことができそうです。コードまで作成していただき大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問