わんくま同盟ホーム
わんくま同盟の最新記事
MyBlog
Ognac試行部屋
ホーム
ウエブ・サービス
RDB
SilverLight2
正規表現
AJAX
小物
連絡する
ヤフー・テキスト校正支援
スキーマ情報を取得する
GridViewのAutoFormatを動的に変更する
GridViewを全画面入力にする
色ダイアログを作る
ZIndex_デモ
グラデーション_デモ
RadialGradientBrus_デモ
ImageBrush_デモ
カーソル_デモ
Rectangle_LinearGradation_デモ
Ellipse Rectangle Line Geometry01_デモ
ArcSegment Geometry02_デモ
PolyLineSegment Geometry03_デモ
PolyBezierSegment Geometry04_デモ
二次ベジエ曲線 Geometry05_デモ
Clip クリップ Geometry06_デモ
文字列回転 RotateTransForm _デモ1
3原色図(思いと違う) Geometry07_デモ
TextBlock例
拡大縮小変換 ScaleTransForm _デモ1
SkewTransform 変換 3D透過_デモ1
MatrixTransform 変換 デモ1
DualAnimation 01
ColorAnimation 02
PointAnimation 03 ベジエ曲線のアニメート
線形KeyFrame 04 LinearDoubleKeyFrame
不連続KeyFrame 05 DiscreteDoubleKeyFrame
スプライン・キーフレーム 06 SplineDoubleKeyFrame
コントロール Button RadioButton HyperLink ListBox
TextBlock TextBox
関数の引数を分離
カンマCSVデータの分離
パスワード制約
名前付きブロック一覧
郵便番号CSVを材料にして正規表現のパターンテストと所要時間の検証
郵便番号CSVの県名、市区名、町域名をXML化する
Client_Control
Server_UpdatePanel
Learning
便利物
AJAX復習
JavaScript_AJAX
HTML
Popupカレンダー
AutoComplete
複数連動ドロップダウン
テキストボックス透かし
リスト検索
イメージによる評価コントロール
TextBoxの入力文字制約
マスクEdit
Numeric:文字も可能
スライダー
トグルボタン
排他的チェックボックス
ドロップダウンコントロール(SharePoint風選択Box)
パスワード強度チェッカー
確認メッセージ(MasterPageだとCancel不動)
吹き出しError表示(Validatorと連動)
NoBotコントロールで怪しいPostBackの判定
伸縮マルチペイン
折畳_展開パネル
ページング箇条書き
モーダルPopUP
モーダルPopUPで色ダイアログを作る
配置変更可能なリスト
スクロールしても表示するパネル
ドラッグパネル
影付パネル
リサイズ可能パネル
角丸パネル
Popupで拡大入力欄
パネル色のアニメート
アニメーション各種
DynamicPopulate_DBとWebServiceの連動1
DynamicPopulate_DBとWebServiceの連動2_単品利用
DynamicPopulate_DBとWebServiceの連動3_JS経由で利用
スライドショー(DB)
スライドショー(DIR)
Updateパネルのイベントシーケンス
Updateパネル_マナー_パネル内は更新項目のみにする
UpdatePanel要素を動的に生成
組み合わせ如何でFocus移動の制御ができる
AJAX処理中にLoadingアニメを表示
PostBackがAJAXによるものか、普通のPostBackかの判定
複数のUpdateパネルがありUpdateModeによる動作
ネストされたパネルとUpdateModeによる動作
Timerで定期的に更新
WebServiceへの架け橋
汎用プロキシクラスでWebServiceCall
複数選択値をListで渡して構造体で受け取る
戻り値をJSON/XML/HTTP Getで受け取る__日付
ジェネリック型辞書のやりとりをする
TimeOut時のエラー情報の取得
Yahoo検索01(クラスでやりとり)
Yahoo検索02(XMLでやりとり)
Web_Pageを get/put で内部呼び出しして結果を受け取る。timeOutの判定と 中断機能をテストする
XMLとJSONのデータを1件取得する
ScriptMasterを動的に取得・Page上にレンダリングされたコントロールIDの取得
例外を起こす
例外を起こす:Default_Errorに飛ばないようにする。Timeout制御も可能
Page内Linkは#とIDで飛び先設定
スタイルのCSS適用と動的変更_Eventの捕捉
HTML要素をJSから更新する
GoogleMapを使う
リソースのローカライズ
MS_AJAX_復習01
クラス・継承・インターフェース・列挙体
ボタンの二重クリック判定
Data取得で、LabelにList形式でセットしPageLoad時の処理を後付して整形する。Json Serialize
非同期Postbackで処理中のタスクを中断する。Eventに対する処理をAddHandlerで後付する。
Event発生ButtonをOffにすることで二度押し防止(add_beginRequest)
非同期処理の終了時にError判定
Sys.Debug.traceDump でメンバーのDump
Sys.Debugの例
StringBuilderの実行速度
クリックするとトグル動作する.DomElement.toggleCssClass
cssクラスを操作する.addCssClass
Mouseイベントの取得:位置とクリック(右Clickを認識しない.保留)
keyDown を認識する。
メソッド伝搬と抑制
JSON化
Application Eventシーケンス
リフレクションで継承具合のCehck
非同期処理後Focus移動
Array_Object操作
Boolean_Parse操作
DateType(Locale表示)
Exceotionの捕捉(例外を起こす)
NumberType(Locale表示)
ObjectTypeの型名
String(メソッド)
Enumerationsを使う
InterFaceを使う
Inheritanceを使う
JavaScript_AJAXの基本_同期と非同期
Radio_Check_select_TextBoxの操作(DOMイベントの捕捉)
ResponseXML(XML-Fileの読み込みとxslの適用)とjkl.ParseXML
JSONPの扱い
DOM NODEを操作する
Prototype.jsを使う Prototype.jsを使う_$A_$F_$___AJAX.Updater_Request
Aculo.usによるEffect
複数効果の組み合わせ
plotrを使ってグラフを描く
Fontのサイズ
VBとC#のFor_Loopの差
グループ化構成体
を参考にしました。
パターン
処理文字列
御託
rc = FUNCA ( a , b ) ; の引数は a と bです。 rc = FUNCB ( FUNCA(a,b) , c) の引数は FUNCA(a,b) と c の二つです。 同様に FUNC_x( xx, x,,,(((....))),,,,) と幾らでも入れ子にできます。 この文字列を 、アプリケーションで処理する時、少し面倒です。 '(' に対応する')'を見つけるのに、順次読み飛ばして行くのが確実でしょう。 字句解析を作りこむのは大層なので、少し面倒。 正規表現でなんとか処理できないでしょうか。単純な字面処理なので、できないように感じます。 しかし、カウント処理が可能な指定があります。 .net.Framework方言では (?<TITLE>[^\(\)]*)(((?'O'\()[^\(\)]*)+((?'C-O'\))[^\(\)]*?)+)*(?(O)(?!))です。 Unix系では別の書式のようです。(不案内です) (*) 処理中に、引数の切り出しに頭から読み込んでいる部分があるので、サンプルとして一貫性が欠けてます。こういうことができるということで願います。 2008/10/02 : 上記に示したパターンは当初 (?<TITLE>[^\(\)]*)(((?'O'\()[^\(\)]*)+((?'C-O'\))[^\(\)]*?)+)*(?(O)(?!)) でしたが、ブラケット内ではEscape不要なので訂正しました。
ソース
■e:\user\cervi.reseller\ognadmin\ognogn.com\www\Regex\Analize_Argument.aspx■ <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Analize_Argument.aspx.cs" Inherits="Regex_Analize_Argument" Title="関数引数の分解" validateRequest="False" maintainScrollPositionOnPostBack ="true" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <a href=http://msdn.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx>グループ化構成体</a>を参考にしました。 <br /> <br /> <asp:Label ID="LBL_パターン" runat="server" Text="パターン"></asp:Label> <br /> <asp:TextBox ID="TB_パターン" runat="server" Width="100%">(?<TITLE>[^()]*)(((?'O'\()[^()]*)+((?'C-O'\))[^()]*?)+)*(?(O)(?!))</asp:TextBox> <br /> <br /> <asp:Label ID="lbl_処理文字列" runat="server" Text="処理文字列"></asp:Label> <br /> <asp:TextBox ID="TB_処理文字列" runat="server" Width="100%">Func_A ( FuncB( a , b ) , Func_C( a , b , c) , Func_D( Sin(30) , cos(40) ) , 漢字 )</asp:TextBox> <br /> <br /> <asp:Button ID="btn_実行" runat="server" onclick="btn_実行_Click" Text="実行" /> <br /> <br /> <asp:TextBox ID="TB_結果" runat="server" Height="233px" ReadOnly="True" TextMode="MultiLine" Width="100%"></asp:TextBox> </ContentTemplate> </asp:UpdatePanel> </asp:Content> ■e:\user\cervi.reseller\ognadmin\ognogn.com\www\Regex\Analize_Argument.aspx.cs■ using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Text.RegularExpressions; using System.Text; using System.IO; using System.Collections.Generic; public partial class Regex_Analize_Argument : System.Web.UI.Page { protected void Page_PreInit(object sender, EventArgs e) { Page.Theme = (string)Session["テーマ"]; } protected void Page_Load(object sender, EventArgs e) { } private int NEST = 0; private void ネストカッコ_SUB(StringBuilder sb, string pat, string text) { NEST++; ネストカッコ_SUB_SUB(sb, pat, text); NEST--; } private string pad(int n) { string pad_ = string.Empty; for (int i = 0; i < n; i++) { pad_ += " "; } return pad_; } private void ネストカッコ_SUB_SUB(StringBuilder sb, string pat, string text) { if (text.Trim().Length == 0) return; var re = new Regex(pat, RegexOptions.Multiline); MatchCollection mc = re.Matches(text); foreach (Match m in mc) { if (m.Value.Trim().Length == 0) continue; int n = m.Groups.Count - 1; string sub = m.Groups[n].Value.Trim(); sb.AppendLine(pad(NEST) + "◆関数名 : " + m.Groups["TITLE"].Value); //+ " : 引数 : " + sub); sb.AppendLine(pad(NEST) + " 引数 : "); TB_結果.Text += "\n" + " 関数 :" + m.Groups["TITLE"].Value; TB_結果.Text += "\n" + " 引数 : " + sub; List<string> ls = subをconnmaで区切る(sub); foreach (string s in ls) { if (s.IndexOf('(') > -1) // 括弧が無いのは最終レベルとする { ネストカッコ_SUB(sb, pat, s); } else { sb.Append(pad(NEST + 1) + s + System.Environment.NewLine); } } } } private List<string> subをconnmaで区切る(string sub) { List<string> ls = new List<string>(); StringBuilder sb = new StringBuilder(1024); int nest = 0; foreach (char c in sub) { if (c == '(') nest++; if (c == ')') nest--; if (nest == 0 && c == ',') { ls.Add(sb.ToString()); sb.Length = 0; } else { sb.Append(c); } } if (sb.Length > 0) { ls.Add(sb.ToString()); sb.Length = 0; } return ls; } protected void btn_実行_Click(object sender, EventArgs e) { try { StringBuilder sb = new StringBuilder(1024); string pat = TB_パターン.Text; string text = TB_処理文字列.Text; ネストカッコ_SUB(sb, pat, text); TB_結果.Text += "\n--------------------------\n"; TB_結果.Text += sb.ToString(); } catch (Exception ex) { TB_結果.Text = ex.Message; } } }