« Webアプリで謎のエラー 0x80070057 | トップページ | Oracleで三者間の権限設定をする話 »

2013年5月31日 (金)

文字列の分解

文字列を分解したい。C#、ASP.NET。.NET Framework 3.5。
しかしstringクラスのsplit()では、区切り文字が失われてしまう。
分解したものを単純に再度くっつけると元の文字列が得られるような分解をしたい。

ごく簡単に調べたけど見当たらなかった。ので作った。
もし車輪の再発明ならぜひ教えてください。すでにあるやつのほうが絶対にいろいろよさそう。
ぎっとはぶにはそういうの置いてあるのかなぁ。

/// <summary>
/// 文字列を分解する、区切り文字も保持する
/// </summary>
/// <param name="s">分解対象文字列</param>
/// <param name="pat" />区切り文字のパターン(正規表現)</param>
/// <returns>分解された文字列配列</returns>
public string[] splitPerfect(string s, string pat)
{
	ArrayList arrList = new ArrayList();
	Regex r;
	Match m;

	r = new Regex(pat);

	while (s.Length > 0)
	{
		m = r.Match(s);
		if (!m.Success)	//--見つからなかったら抜ける
		{
			arrList.Add(s);
			break;
		}
		arrList.Add(m.Value.Substring(0, (m.Value.Length >= 2) ? m.Value.Length - 1 : m.Value.Length));
		s = s.Substring((arrList[arrList.Count-1] as string).Length);
	}
	return (string[])arrList.ToArray(typeof(string));
}

くっそ遅そう。実際にはどうかわかんないですけど。測定するつもりもない。

本体としては以上なんですが、目的としてはちょっとばかしSQL文を分解したいというものなので、こういうのをくっつけまして。

/// <summary>
/// SQLを分解するための区切り文字パターン(正規表現)
/// </summary>
/// <remarks>()[]+*-/><=(半角スペース),.(タブ)"':; のどれかと一致するように記述</remarks>
public string strSqlSplitPattern = ".*?[\\(\\)\\[\\]\\+\\*-/><= ,\\.\\t\"\':;]";

/// <summary>
/// 文字列を分解する、区切り文字も保持する
/// </summary>
/// <remarks>区切り文字のパターンとしてstrSqlSplitPatternを使う</remarks>
/// <param name="s">分解対象文字列</param>
/// <returns>分解された文字列配列</returns>
public string[] splitPerfect(string s)
{
	return splitPerfect(s, strSqlSplitPattern);
}

SELECT COL1, COL2 FROM EMPLOYEE WHERE COL3 = 'hogehoge' AND (0=1 OR 1>= 0)

というSQL文があったとして、

SELECT

COL1
,

COL2

FROM

EMPLOYEE

WHERE

COL3

=

'
hogehoge
'

AND

(
0
=
1

OR

1
>
=

0
)

という組に分けてくれるよ。

テストコード。

string example = 好きなSQL文を入れてね!

string[] tmppp= fugaClass.splitPerfect(example);

System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < tmppp.Length; i++)
{
	sb.Append(tmppp[i]);
}
if (sb.ToString().Equals(example))
{
	string result = "Match!";
}

当然ながらすべからく適当なのでうまいことやってくださいね。
上に載せたSQLの区切り文字パターン strSqlSplitPattern も、こっちの要件で適当に作ってあるので、自分の用途に合うように考えてから使ってください。
' クオテーションの中に書かれた文字列とかも考慮しないでぶった切っちゃうからね。
‥‥えっそれ大丈夫なんかいな。うーんもうちょっと考えないといかんのかな。

OracleだとかSQL Serverだとかの差も考えてくださいね。
正規表現勉強してね。僕も全然詳しくなくて好きじゃないんだけど仕方ない。

この辺を参考にしてコピペった部分もあります。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1394207798
http://freelancer.yoka-yoka.jp/e337117.html

« Webアプリで謎のエラー 0x80070057 | トップページ | Oracleで三者間の権限設定をする話 »

パソコン・インターネット」カテゴリの記事

コメント

ロレックスチェリーニスーパーコピー腕時計販売特集!
ロレックスチェリーニスーパーコピーN品を低価でお客様に提供します。
ロレックスコピー,【2~9万円】スーパーコピーロレックス時計大特価通販!
偽物ブランド時計 https://www.cocoejp1.com/NewsList.aspx?pageIndex=3

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 文字列の分解:

« Webアプリで謎のエラー 0x80070057 | トップページ | Oracleで三者間の権限設定をする話 »

AmazonSearch


最近のトラックバック

無料ブログはココログ