实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Configuration; using System.Data; using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; 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; public partial class Tester : PageBase { #region Constants private const int MAX_INPUT_LENGTH = 1000000; private const int MAX_MATCHES = 1000; private const int MAX_GROUPS = 500; private const int MAX_CAPTURES = 200; private const int MAX_PERMALINK_LENGTH = 1024; private const string MATCH_HIGHLIGHT_LEFT_MARKER = "(--##REGEXSTORM:LEFT##--)"; private const string MATCH_HIGHLIGHT_RIGHT_MARKER = "(--##REGEXSTORM:RIGHT##--)"; private const string EMPTY_START_MESSAGE = "Enter your <strong>pattern</strong> and <strong>input</strong> above to see the good stuff here."; #endregion #region Enums private enum DetailsPanels { None = 0, RegexInfo = 1, Table = 2, Context = 3, SplitList = 4, All = 5 } #endregion #region Variables private int startPosition; // where in input to begin search private int matchesLimit; // limits total matches displayed private Regex testRegex; // the main regex used for testing private MatchCollection matches; // matches found from regex, set from RegexMatchWorker() #endregion #region Constructors public Tester() { // wire page events this.Init = new EventHandler(Tester_Init); this.Load = new EventHandler(Tester_Load); this.PreRender = new EventHandler(Tester_PreRender); } #endregion #region Events protected void Tester_Init(object sender, EventArgs e) { // wire control events btnRun.Click = new ImageClickEventHandler(btnRun_Click); rptSplitList.ItemDataBound = new RepeaterItemEventHandler(rptSplitList_ItemDataBound); dlDetailsTable.ItemDataBound = new DataListItemEventHandler(dlDetailsTable_ItemDataBound); // declare controls that need view state AddViewStateControl(upHaystackBackdrop); AddViewStateControl(upDetailsInfo); AddViewStateControl(upDetailsTable); AddViewStateControl(upDetailsContext); AddViewStateControl(upDetailsSplit); // this stuff doesn't need to be set during async postbacks if (!ScriptManager.GetCurrent(this).IsInAsyncPostBack) { // add head stuff Title = ".NET Regex Tester - Regex Storm"; AddStylesheet("~/Stylesheets/Tester.css"); AddJavascript("~/Javascripts/Tester.js"); // ugly browser sniffing to apply stylesheets to fix little issues switch(Request.Browser.Browser) { case "Firefox": // all firefox AddStylesheet("~/Stylesheets/TesterFixes/firefox-all.css"); if (Request.Browser.MajorVersion == 3 && Request.Browser.MinorVersion == 0) { // only for firefox3.0 AddStylesheet("~/Stylesheets/TesterFixes/firefox-3.0.css"); } break; case "IE": if (Request.Browser.MajorVersion <= 7) { // only for ie7 AddStylesheet("~/Stylesheets/TesterFixes/ie-7.x.css"); } break; case "AppleMAC-Safari": if (!Request.UserAgent.Contains("Chrome")) { // must check user agent to distinguish safari from chrome AddStylesheet("~/Stylesheets/TesterFixes/safari-all.css"); } break; } // lots of javascript vars AddJavascriptVar("hgcHaystackBackdropId", hgcHaystackBackdrop.ClientID); AddJavascriptVar("btnRunId", btnRun.ClientID); AddJavascriptVar("txtStartPositionId", txtStartPosition.ClientID); AddJavascriptVar("txtMatchesLimit", txtMatchesLimit.ClientID); AddJavascriptVar("hlDetailsInfoId", hlDetailsInfo.ClientID); AddJavascriptVar("hlDetailsTableId", hlDetailsTable.ClientID); AddJavascriptVar("hlDetailsContextId", hlDetailsContext.ClientID); AddJavascriptVar("hlDetailsSplitId", hlDetailsSplit.ClientID); AddJavascriptVar("pnlDetailsInfoId", pnlDetailsInfo.ClientID); AddJavascriptVar("pnlDetailsSplitId", pnlDetailsSplit.ClientID); AddJavascriptVar("pnlDetailsContextId", pnlDetailsContext.ClientID); AddJavascriptVar("pnlDetailsTableId", pnlDetailsTable.ClientID); AddJavascriptVar("pnlPermalinkId", pnlPermalink.ClientID); AddJavascriptVar("hfUpdateHaystackBackdropId", hfUpdateHaystackBackdrop.ClientID); AddJavascriptVar("hfWipeDetailsLinksId", hfWipeDetailsLinks.ClientID); AddJavascriptVar("hfDetailsLinkId", hfDetailsLink.ClientID); AddJavascriptVar("hfHasMatchesId", hfHasMatches.ClientID); } } protected void Tester_Load(object sender, EventArgs e) { // set up some validators that depend on server-side constants string lengthExpression = "^(.|\\s){0," MAX_INPUT_LENGTH.ToString() "}$"; revPatternLength.ValidationExpression = lengthExpression; revPatternLength.ErrorMessage = string.Format(revPatternLength.ErrorMessage, MAX_INPUT_LENGTH); revHaystackLength.ValidationExpression = lengthExpression; revHaystackLength.ErrorMessage = string.Format(revHaystackLength.ErrorMessage, MAX_INPUT_LENGTH); revReplacementLength.ValidationExpression = lengthExpression; revReplacementLength.ErrorMessage = string.Format(revReplacementLength.ErrorMessage, MAX_INPUT_LENGTH); rvMatchesLimit.MaximumValue = MAX_MATCHES.ToString(); rvMatchesLimit.ErrorMessage = string.Format(rvMatchesLimit.ErrorMessage, MAX_MATCHES); if (!Page.IsPostBack) { // there may be stuff on the query string to load into the form this.LoadFromQueryString(); if (txtPattern.Text.Length > 0 && txtHaystack.Text.Length > 0) { // we already have enough stuff from the query string to run the regex Page.Validate(); RunRegex(true, DetailsPanels.All); } else { // starting off with empty pattern and haystack inputs lblRegexInfoBlurb.Text = EMPTY_START_MESSAGE; } } else if (ScriptManager.GetCurrent(this).IsInAsyncPostBack) { // get boolean for whether to update haystack backdrop bool updateHaystackBackdrop = (hfUpdateHaystackBackdrop.Value == "true"); // translate detals tab id to details panel enum DetailsPanels detailsPanel = DetailsPanels.None; if (hfDetailsLink.Value == hlDetailsInfo.ClientID) { detailsPanel = DetailsPanels.RegexInfo; } else if (hfDetailsLink.Value == hlDetailsTable.ClientID) { detailsPanel = DetailsPanels.Table; } else if (hfDetailsLink.Value == hlDetailsContext.ClientID) { detailsPanel = DetailsPanels.Context; } else if (hfDetailsLink.Value == hlDetailsSplit.ClientID) { detailsPanel = DetailsPanels.SplitList; } // validate and run Page.Validate(); RunRegex(updateHaystackBackdrop, detailsPanel); } } protected void Tester_PreRender(object sender, EventArgs e) { if (!ScriptManager.GetCurrent(this).IsInAsyncPostBack) { // fix issue where the leading line break is eaten in multiline textboxes txtPattern.Text = txtPattern.Text; txtReplacement.Text = txtReplacement.Text; txtHaystack.Text = txtHaystack.Text; } if (this.IsDevEnvironment) { // simulate round trip delay (helps with testing async stuff) Random rand = new Random(); Thread.Sleep(rand.Next(200, 400)); } } protected void dlDetailsTable_ItemDataBound(Object sender, DataListItemEventArgs e) { // for limiting groups displayed int numDisplayGroups = Math.Min(testRegex.GetGroupNumbers().Count(), MAX_GROUPS 1); switch (e.Item.ItemType) { case ListItemType.Header: // grab controls TableHeaderRow thrHeader = (TableHeaderRow)e.Item.FindControl("thrHeader"); if (cbReplacement.Checked) { // add header cell for replacement value TableHeaderCell thcReplacement = new TableHeaderCell(); thcReplacement.Controls.Add(new LiteralControl("Replacement")); thrHeader.Cells.Add(thcReplacement); } // add a header cell for each group name for (int i = 1; i < numDisplayGroups; i ) { // decide how to display this group column header string groupDisplay; int groupNumber = testRegex.GetGroupNumbers()[i]; string groupName = testRegex.GroupNameFromNumber(groupNumber); if (groupNumber.ToString() == groupName) { // name is same as number, assume group is unnamed groupDisplay = "$" groupName; } else { // named group groupDisplay = "${" groupName "}"; } TableHeaderCell thcGroup = new TableHeaderCell(); thcGroup.Controls.Add(new LiteralControl(groupDisplay)); if (i == 1) { thcGroup.CssClass = "first_group"; } thrHeader.Cells.Add(thcGroup); } break; case ListItemType.Item: case ListItemType.AlternatingItem: TableRow trRow = (TableRow)e.Item.FindControl("trRow"); if (e.Item.ItemIndex < matchesLimit) { // grab match Match match = (Match)e.Item.DataItem; // grab controls Literal litMatchIndex = (Literal)e.Item.FindControl("litMatchIndex"); Literal litPosition = (Literal)e.Item.FindControl("litPosition"); Literal litValue = (Literal)e.Item.FindControl("litValue"); // alternating row style trRow.CssClass = (((e.Item.ItemIndex & 1) == 0) ? "odd" : "even"); // set literals litMatchIndex.Text = e.Item.ItemIndex.ToString(); litPosition.Text = match.Index.ToString(); litValue.Text = GetTextDisplay(match.Value, false); if (cbReplacement.Checked) { // add cell for replacement TableCell tcReplacement = new TableCell(); trRow.Cells.Add(tcReplacement); // label with value Literal litReplacementValue = new Literal(); litReplacementValue.Text = GetTextDisplay(match.Result(txtReplacement.Text), false); tcReplacement.Controls.Add(litReplacementValue); } // add a cell for each group value for (int i = 1; i < numDisplayGroups; i ) { Group displayGroup = match.Groups[i]; // cell TableCell tcGroupValue = new TableCell(); if (i == 1) { tcGroupValue.CssClass = "first_group"; } // label with value Literal litGroupValue = new Literal(); litGroupValue.Text = GetTextDisplay(displayGroup.Value, false); tcGroupValue.Controls.Add(litGroupValue); // if capture collection is not trivial (1) then show them if (displayGroup.Captures.Count > 1) { // line break tcGroupValue.Controls.Add(new LiteralControl("<br />")); // captures count text (changed to toggle link if javascript on) Label lblCapturesCount = new Label(); lblCapturesCount.Text = displayGroup.Captures.Count.ToString() " captures"; lblCapturesCount.CssClass = "captures_count"; tcGroupValue.Controls.Add(lblCapturesCount); // captures container Panel pnlCapturesContainer = new Panel(); pnlCapturesContainer.CssClass = "captures"; tcGroupValue.Controls.Add(pnlCapturesContainer); // ordered list HtmlGenericControl hgcCapturesList = new HtmlGenericControl("ol"); hgcCapturesList.Attributes.Add("start", "0"); pnlCapturesContainer.Controls.Add(hgcCapturesList); // captures within list Repeater rptCaptures = new Repeater(); rptCaptures.ItemDataBound = new RepeaterItemEventHandler(rptCaptures_ItemDataBound); rptCaptures.DataSource = displayGroup.Captures; rptCaptures.DataBind(); hgcCapturesList.Controls.Add(rptCaptures); if (displayGroup.Captures.Count > MAX_CAPTURES) { Panel pnlCapturesRemaining = new Panel(); pnlCapturesRemaining.CssClass = "captures_remaining"; pnlCapturesRemaining.Controls.Add( new LiteralControl((displayGroup.Captures.Count - MAX_CAPTURES).ToString() " more not shown")); pnlCapturesContainer.Controls.Add(pnlCapturesRemaining); } } trRow.Cells.Add(tcGroupValue); } } else { // this row is beyond the matches limit, do not show trRow.Visible = false; } break; } } protected void rptCaptures_ItemDataBound(Object sender, RepeaterItemEventArgs e) { // only render if we haven't exceeded the max number of captures to show if (e.Item.ItemIndex < MAX_CAPTURES) { Capture capture = (Capture)e.Item.DataItem; Literal litCapture = new Literal(); litCapture.Text = GetTextDisplay(capture.Value, true); HtmlGenericControl hgcCaptureItem = new HtmlGenericControl("li"); hgcCaptureItem.Controls.Add(litCapture); e.Item.Controls.Add(hgcCaptureItem); } } protected void rptSplitList_ItemDataBound(Object sender, RepeaterItemEventArgs e) { string text = e.Item.DataItem.ToString(); Literal litSplitTextItem = (Literal)e.Item.FindControl("litSplitTextItem"); litSplitTextItem.Text = GetTextDisplay(text, true); } protected void btnRun_Click(Object sender, EventArgs e) { if (!ScriptManager.GetCurrent(this).IsInAsyncPostBack) { // old fashioned submit button click RunRegex(true, DetailsPanels.All); } } #endregion #region Private Methods private void RunRegex(bool updateHaystackBackdrop, DetailsPanels detailsPanel) { bool isPageValid = false; // flag that keeps track of validation success long elapsedMilliseconds = 0; // total time it took for the regex to run // begin series of setup and validation steps if (Page.IsValid) { // at this point, we know these are numerical values startPosition = Convert.ToInt32(txtStartPosition.Text); matchesLimit = Convert.ToInt32(txtMatchesLimit.Text); // check numerical value of start position if (startPosition > txtHaystack.Text.Length) { cvStartPositionMaxValue.IsValid = false; } if (Page.IsValid) { // browsers other than IE do not include \r in inputs during async postback // this normalizes inputs to always have \r\n for newlines instead of just \n txtPattern.Text = Regex.Replace(txtPattern.Text, "\r?\n", "\r\n"); txtHaystack.Text = Regex.Replace(txtHaystack.Text, "\r?\n", "\r\n"); txtReplacement.Text = Regex.Replace(txtReplacement.Text, "\r?\n", "\r\n"); // collect options RegexOptions regexOptions = 0; if (cbIgnoreCase.Checked) { regexOptions = regexOptions | RegexOptions.IgnoreCase; } if (cbIgnorePatternWhitespace.Checked) { regexOptions = regexOptions | RegexOptions.IgnorePatternWhitespace; } if (cbExplicitCapture.Checked) { regexOptions = regexOptions | RegexOptions.ExplicitCapture; } if (cbCultureInvariant.Checked) { regexOptions = regexOptions | RegexOptions.CultureInvariant; } if (cbSingleline.Checked) { regexOptions = regexOptions | RegexOptions.Singleline; } if (cbMultiline.Checked) { regexOptions = regexOptions | RegexOptions.Multiline; } if (cbRightToLeft.Checked) { regexOptions = regexOptions | RegexOptions.RightToLeft; } if (cbEcmaScript.Checked) { regexOptions = regexOptions | RegexOptions.ECMAScript; } // initialize new regex object, careful to catch any parsing exception from // the pattern to show to the user as a validation error try { testRegex = new Regex(txtPattern.Text, regexOptions); } catch (ArgumentOutOfRangeException) { // ECMA script option throws exception if used with certain other options cvInvalidOptionsCombo.IsValid = false; } catch (ArgumentException ex) { // catch parsing exceptions, double check message to make sure it's // the type of exception we're expecting if (ex.Message.StartsWith("parsing") && ex.Message.Contains(" - ")) { // display part of the exception message string as a validation error cvPatternParsing.ErrorMessage = ex.Message.Substring(ex.Message.LastIndexOf(" - ") 3).TrimEnd('.'); cvPatternParsing.IsValid = false; } } if (Page.IsValid) { // the actual regex match execution happens within elapsedMilliseconds = TimeLimitedRegexMatch(); if (Page.IsValid) { // winner! isPageValid = true; } } } } if (!isPageValid) { // page is invalid, will fall back to regex info details tab to show errors hfHasMatches.Value = "false"; lblRegexInfoBlurb.Visible = false; pnlPermalinkWrap.Visible = false; hfDetailsLink.Value = hlDetailsInfo.ClientID; upDetailsInfo.Update(); } else { // page is valid if (txtPattern.Text.Length == 0 || txtHaystack.Text.Length == 0) { // not enough input hfHasMatches.Value = "false"; lblRegexInfoBlurb.Text = EMPTY_START_MESSAGE; if (updateHaystackBackdrop) { // clear haystack backdrop (panel updated later) hgcHaystackBackdrop.InnerHtml = ""; } hfDetailsLink.Value = hlDetailsInfo.ClientID; upDetailsInfo.Update(); } else { // count matches int matchesCount = Math.Min(matches.Count, matchesLimit); // send this flag back to the page hfHasMatches.Value = (matchesCount > 0) ? "true" : "false"; // regex info details panel doesn't require matches to be found // furthermore, if no matches are found, active panel is reverted to regex info on client-side if (matchesCount == 0 || detailsPanel == DetailsPanels.All || detailsPanel == DetailsPanels.RegexInfo) { // display matches count and timing info in the regex info blurb lblRegexInfoBlurb.Text = "<strong>" matchesCount.ToString() "</strong>" (matchesCount == 1 ? " match" : " matches") " found in about " "<strong>" elapsedMilliseconds.ToString() "</strong>" (elapsedMilliseconds == 1 ? " millisecond" : " milliseconds") "."; SetPermalink(); hfDetailsLink.Value = hlDetailsInfo.ClientID; upDetailsInfo.Update(); } // all other details panels (and the haystack backdrop) require that matches were found if (matchesCount > 0) { if (updateHaystackBackdrop) { string matchesInContext = testRegex.Replace(txtHaystack.Text, new MatchEvaluator(MatchHighlightNoReplacements), matchesLimit, startPosition); matchesInContext = HttpUtility.HtmlEncode(matchesInContext); matchesInContext = matchesInContext.Replace(MATCH_HIGHLIGHT_LEFT_MARKER, "<em>"); matchesInContext = matchesInContext.Replace(MATCH_HIGHLIGHT_RIGHT_MARKER, "</em>"); // fix newline weirdness matchesInContext = matchesInContext.Replace("\r", ""); // update haystack backdrop hgcHaystackBackdrop.InnerHtml = '\n' matchesInContext '\n'; } if (detailsPanel == DetailsPanels.All || detailsPanel == DetailsPanels.Context) { // both haystack backdrop and the context details panel need the string for matches in context string matchesInContext = testRegex.Replace(txtHaystack.Text, new MatchEvaluator(MatchHighlight), matchesLimit, startPosition); matchesInContext = HttpUtility.HtmlEncode(matchesInContext); matchesInContext = matchesInContext.Replace(MATCH_HIGHLIGHT_LEFT_MARKER, "<em>"); matchesInContext = matchesInContext.Replace(MATCH_HIGHLIGHT_RIGHT_MARKER, "</em>"); // fix newline weirdness matchesInContext = matchesInContext.Replace("\r", ""); // update context details panel, adding zero-width spaces after newlines to // ensure proper highlighting around line breaks hgcDetailsContext.InnerHtml = "\n" matchesInContext.Replace("\n", "\n​") '\n'; upDetailsContext.Update(); } if (detailsPanel == DetailsPanels.All || detailsPanel == DetailsPanels.Table) { // matches table dlDetailsTable.DataSource = matches; dlDetailsTable.DataBind(); upDetailsTable.Update(); } if (detailsPanel == DetailsPanels.All || detailsPanel == DetailsPanels.SplitList) { // split list hgcSplitList.Attributes.Add("start", "0"); rptSplitList.DataSource = testRegex.Split(txtHaystack.Text, matchesLimit, startPosition); rptSplitList.DataBind(); upDetailsSplit.Update(); } } } } // this is just for users that don't have javascript on if (hfHasMatches.Value == "true") { pnlDetailsTable.Style["display"] = "block"; pnlDetailsContext.Style["display"] = "block"; pnlDetailsSplit.Style["display"] = "block"; } else { pnlDetailsTable.Style["display"] = "none"; pnlDetailsContext.Style["display"] = "none"; pnlDetailsSplit.Style["display"] = "none"; } if (updateHaystackBackdrop) { upHaystackBackdrop.Update(); } } private void LoadFromQueryString() { // remembers if an invalid query string value was encountered bool invalidValueFound = false; // pattern if (!string.IsNullOrEmpty(Request.QueryString["p"])) { txtPattern.Text = Request.QueryString["p"]; } // haystack if (!string.IsNullOrEmpty(Request.QueryString["i"])) { txtHaystack.Text = Request.QueryString["i"]; } // replacement (this one allows empty inputs) if (Request.QueryString["r"] != null) { cbReplacement.Checked = true; txtReplacement.Text = Request.QueryString["r"]; } // options string regexOptionsCode = Request.QueryString["o"]; if (!string.IsNullOrEmpty(regexOptionsCode)) { if (regexOptionsCode.Contains("i")) { cbIgnoreCase.Checked = true; } if (regexOptionsCode.Contains("x")) { cbIgnorePatternWhitespace.Checked = true; } if (regexOptionsCode.Contains("n")) { cbExplicitCapture.Checked = true; } if (regexOptionsCode.Contains("c")) { cbCultureInvariant.Checked = true; } if (regexOptionsCode.Contains("s")) { cbSingleline.Checked = true; } if (regexOptionsCode.Contains("m")) { cbMultiline.Checked = true; } if (regexOptionsCode.Contains("r")) { cbRightToLeft.Checked = true; } if (regexOptionsCode.Contains("e")) { cbEcmaScript.Checked = true; } if (Regex.IsMatch(regexOptionsCode, "[^ixncsmre]")) { // something invalid in options, redirect to correct invalidValueFound = true; } } // start position string startPositionQS = Request.QueryString["s"] ?? ""; if (startPositionQS.Length == 0) { // default startPosition = 0; } else { int startPositionValue; if (!int.TryParse(startPositionQS, out startPositionValue) || startPositionValue < 0) { // converstion failed or value is negative, redirect to correct startPosition = 0; invalidValueFound = true; } else { // incoming value is good startPosition = startPositionValue; } } txtStartPosition.Text = startPosition.ToString(); // matches limit string matchesLimitQS = Request.QueryString["l"] ?? ""; if (matchesLimitQS.Length == 0) { // default matchesLimit = MAX_MATCHES; } else { int matchesLimitValue; if (!int.TryParse(matchesLimitQS, out matchesLimitValue) || matchesLimitValue < 1 || matchesLimitValue > MAX_MATCHES) { // converstion failed or value is not positive or value is too high, redirect to correct matchesLimit = MAX_MATCHES; invalidValueFound = true; } else { // incoming value is good matchesLimit = matchesLimitValue; } } txtMatchesLimit.Text = matchesLimit.ToString(); // if anything was invalid, redirect to self, but with a query string that // has the invalid values defaulted to something better if (invalidValueFound) { Response.Redirect(this.GetStateUrl()); } } private string GetStateUrl() { StringBuilder queryString = new StringBuilder(); // pattern if (!string.IsNullOrEmpty(txtPattern.Text)) { queryString.Append("&p=" HttpUtility.UrlEncode(txtPattern.Text)); } // haystack if (!string.IsNullOrEmpty(txtHaystack.Text)) { queryString.Append("&i=" HttpUtility.UrlEncode(txtHaystack.Text)); } // replacement (determined by checkbox) if (cbReplacement.Checked) { queryString.Append("&r=" HttpUtility.UrlEncode(txtReplacement.Text)); } // regex options StringBuilder regexOptionsCode = new StringBuilder(); if (cbIgnoreCase.Checked) { regexOptionsCode.Append("i"); } if (cbIgnorePatternWhitespace.Checked) { regexOptionsCode.Append("x"); } if (cbExplicitCapture.Checked) { regexOptionsCode.Append("n"); } if (cbCultureInvariant.Checked) { regexOptionsCode.Append("c"); } if (cbSingleline.Checked) { regexOptionsCode.Append("s"); } if (cbMultiline.Checked) { regexOptionsCode.Append("m"); } if (cbRightToLeft.Checked) { regexOptionsCode.Append("r"); } if (cbEcmaScript.Checked) { regexOptionsCode.Append("e"); } if (regexOptionsCode.Length > 0) { queryString.Append("&o=" HttpUtility.UrlEncode(regexOptionsCode.ToString())); } // start position if (startPosition != 0) { queryString.Append("&s=" HttpUtility.UrlEncode(txtStartPosition.Text)); } // matches limit if (matchesLimit != MAX_MATCHES) { queryString.Append("&l=" HttpUtility.UrlEncode(txtMatchesLimit.Text)); } // create a new url with current scheme and host UriBuilder url = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port); // set raw path url.Path = this.RawPath; // set new query string url.Query = queryString.ToString().TrimStart('&'); // return the full absolute url return url.Uri.AbsoluteUri; } private string MatchHighlightNoReplacements(Match m) { return MATCH_HIGHLIGHT_LEFT_MARKER m.Value MATCH_HIGHLIGHT_RIGHT_MARKER; } private string MatchHighlight(Match m) { if (cbReplacement.Checked) { // replace, show the replacement string return MATCH_HIGHLIGHT_LEFT_MARKER m.Result(txtReplacement.Text) MATCH_HIGHLIGHT_RIGHT_MARKER; } else { // match and split, show the matched string return MATCH_HIGHLIGHT_LEFT_MARKER m.Value MATCH_HIGHLIGHT_RIGHT_MARKER; } } private string GetTextDisplay(string text, bool requireWrappingSpan) { // why return strings with span tags inside instead of just using a Label? // to avoid putting long-ass namespaced IDs in the HTML, which is especially // unfavorable when returning async payloads string returnText; if (text.Length == 0) { returnText = "<span class=\"non-lit\">empty string</span>"; } else if (Regex.IsMatch(text, "^\\s $")) { returnText = "<span class=\"non-lit\">whitespace</span>"; } else { returnText = HttpUtility.HtmlEncode(text).Replace("\n", "<br />\n"); if (requireWrappingSpan) { returnText = "<span>" returnText "</span>"; } } return returnText; } private long TimeLimitedRegexMatch() { // run RegexMatchWorker() in a time limited thread Thread t = new Thread(new ThreadStart(RegexMatchWorker)); // start thread and wait while timing it Stopwatch matchStopWatch = Stopwatch.StartNew(); t.Start(); bool finished = t.Join(3000); matchStopWatch.Stop(); if (!finished) { // taking too long, kill it and show the timeout error message t.Abort(); cvPatternTimeout.IsValid = false; } return matchStopWatch.ElapsedMilliseconds; } private void RegexMatchWorker() { try { matches = testRegex.Matches(txtHaystack.Text, startPosition); // regex isn't actually executed until the matches collection is referenced // this throw-away variable instantiation exists solely for that purpose int totalMatches = matches.Count; } catch (ThreadAbortException) { } } private void SetPermalink() { pnlPermalinkWrap.Visible = true; txtPermalink.Text = this.GetStateUrl(); pnlPermalinkLengthWarning.Visible = (txtPermalink.Text.Length > MAX_PERMALINK_LENGTH); } #endregion }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论