删除多行文本框中的空白行
在一些调研或者投票程序中,经常都要设置题目的各个选择支,最常见的办法有两种:
1. 每次添加一个选择支,如果该题目有N个选项,就添加N次;
2. 把所有的选项都填写入一个文本框中,用特殊的分隔符(如:“|”、“$”等)分隔各个选项,然后再对所得的内容进行处理。
如果调研或投票程序中只有少量题目第一种方法尚且还行得通,在题目较多是就显得比较繁杂。因此,很多情况下都采用第二种。
在第二种做法中,比较方便、直观也采用得比较多的是把全部选项都填写到多行文本框中,每个选项分别占用一行,然后根据填写的内容一次性生成题目的选择项。但这种方法伴随着一个问题:如何消除因偶然的错误输入所产生的空白行。
可能产生的空白行主要有纯粹由一个回车产生的空白行和由一个或多个空格产生的空白行两种(也有可能由制表符或制表符和空格混合产生的空白行,但这种极少见,处理方法也类似)。产生空白行的地方有三处:段首、段中和末尾。而且每处空白可能由一行或多行构成。
一般的处理方法是分割各个选项,采用数组存储,遍历数组,如果数组的项为空,则删除该项,然后生成选择项。自己遇到了这种情况,觉得用数组处理比较麻烦,相比之下采用正则表达式比较简洁。
函数如下:
Imports System.Text.RegularExpressions
Function DealWithBlank(ByVal str As String) As String
‘处理前后和中间的空格空白行
str = Regex.Replace(str, "^ */r/n", "", RegexOptions.Multiline)
str = Regex.Replace(str, "/r/n *$", vbCrLf, RegexOptions.Multiline)
‘处理回车产生的回车空白行
str = Regex.Replace(str, "(/r/n){1,}", vbCrLf)
str = Regex.Replace(str, "/r/n$", "")
‘返回满足文本框格式的字符串
Return str
End Function
例子:
Index.aspx
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="index.aspx.vb" Inherits="Test.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>WebForm1</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:textbox id="TextBox1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" Columns="60" Rows="8" TextMode="MultiLine"></asp:textbox>
<asp:Label id="Label1" style="Z-INDEX: 105; LEFT: 8px; POSITION: absolute; TOP: 304px" runat="server">Label</asp:Label>
<asp:checkboxlist id="CheckBoxList1" style="Z-INDEX: 104; LEFT: 544px; POSITION: absolute; TOP: 16px"
runat="server"></asp:checkboxlist>
<asp:button id="Button1" style="Z-INDEX: 103; LEFT: 192px; POSITION: absolute; TOP: 160px" runat="server" Text="清除空行"></asp:button>
<asp:textbox id="TextBox2" style="Z-INDEX: 102; LEFT: 8px; POSITION: absolute; TOP: 200px" runat="server" Columns="60" Rows="5" TextMode="MultiLine"></asp:textbox>
</form>
</body>
</HTML>
Index.aspx.vb
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Text
Imports System.Text.RegularExpressions
Imports Microsoft
Imports Microsoft.VisualBasic
Public Class WebForm1
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents CheckBoxList1 As System.Web.UI.WebControls.CheckBoxList
'注意: 以下占位符声明是 Web 窗体设计器所必需的。
'不要删除或移动它。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
End Sub
'**************************************************************************
'
'替换回车换行和空格函数
'
'**************************************************************************
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim StrTB1, StrTB2 As String
StrTB1 = TextBox1.Text
StrTB2 = DealWithBlank(StrTB1)
TextBox2.Text = StrTB2
End Sub
Function DealWithBlank(ByVal str As String) As String
str = Regex.Replace(str, "^ */r/n", "", RegexOptions.Multiline)
str = Regex.Replace(str, "/r/n *$", vbCrLf, RegexOptions.Multiline)
str = Regex.Replace(str, "(/r/n){1,}", vbCrLf)
str = Regex.Replace(str, "/r/n$", "")
Return str
End Function
End Class