不要问这是如何工作的,但目前它做("^\|*(.*?)\|*$")…差不多吧。这删除了所有多余的管道,第一部分,我还没有搜索过。我使用的是VB2011测试版,asp网页表单,vb代码!
我想要捕获用于分隔单词的特殊字符pipe (|),即car|truck|van|cycle。
问题是,用户通常以开头,结尾,使用多个,并在每个管道前后使用空格,即|||car||truck | van || cycle。
另一个例子:george bush|micheal jordon|bill gates|steve jobs <--这是正确的,但当我删除空格时,它会去掉正确的空格。
所以我想去掉任何前导空格,尾随空格,|之前的空格和|之后的空格,当然,在字母数字字符之间只允许一个竖线(|)。
发布于 2012-06-21 12:20:51
要求:
下面是一些示例输入和->输出:
"|||car | boat|||" -> "car|boat"
"george bush|micheal jordon|bill gates|steve jobs"
-> "george bush|micheal jordon|bill gates|steve jobs"
" george bush|micheal jordon |bill gates |steve jobs "
-> "george bush|micheal jordon|bill gates|steve jobs"
"123|||123" -> "123|123"你的例子对你来说几乎是有效的:
("^\|*(.*?)\|*$")在我们进一步讨论之前,最好先提一下MSDN参考页面:http://msdn.microsoft.com/en-us/library/az24scfc.aspx
还有这个在线测试页面:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx
我的正则表达式不够强大,因为我认为这个正则表达式可能会起作用,但它看起来是一项艰难的工作。我编写了内联文档,但它仍然很复杂(而且完全不起作用)
^(?:\|*)((?:\s*)([a-zA-Z0-9]?[a-zA-Z0-9 ]*[a-zA-Z0-9]?)(?:\s*)\|?(?:\|*))(?:\|*)$
^ - start the line/input
(?:\|*) - capture any pipes at the beginning but ignore them
( - begin matching so we can get the values out the other side
(?:\s*) - trim leading spaces
[a-zA-Z0-9]?[a-zA-Z0-9 ]*[a-zA-Z0-9]? - match any alphanumerics with spaces in between
(?:\s*) - trim trailing spaces
\| - match any one pipe
(?:\|*) - ignore any remaining pipes in a row
)* - end matching, we should be done
(?:\|*) - capture any pipes at the end but ignore them
$ - end of the line/input那么,让我们试着解决这个问题,好吗?
你应该拆分管道,向前看,看看下一个字符串是否为空长度字符串,如果不是,则将其添加到现有的单词长度中。让我们试一试:
(对于这一部分,我将使用DotNetPad ) http://dotnetpad.net/ViewPaste/4bpRXD-vZEOwqTLDQbEECg
以下是一个示例应用程序,它可以满足您的需求,并且最大限度地减少了麻烦:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class DotNetPad {
public static void Main(string[] args) {
string[] tests = new[] {
"|||car | boat|||",
"george bush|micheal jordon|bill gates|steve jobs",
" george bush|micheal jordon |bill gates |steve jobs ",
"123|||123"
};
foreach(var s in tests)
Console.WriteLine(CleanString(s));
}
public static string CleanString(string input) {
string result = string.Empty;
string[] split = input.Split(new[] {
'|'
});
foreach(var s in split) {
if (!string.IsNullOrEmpty(s)) {
result += "|" + s.Trim();
}
}
return result.Substring(1);
}
}我最多花了10分钟在第二个代码上,以及我编辑这篇文章后的所有内容,试图让正则表达式正常工作。这个故事的寓意是:只做你必须做的工作,而不是所有事情都使用正则表达式。
发布于 2012-06-21 12:24:31
我将从删除空格开始:
MyString = Regex.Replace(MyString, "[ ]*\|[ ]*", "|")然后是多个管道:
MyString = Regex.Replace(MyString, "\|{2,}", "|")例如
Dim MyString As String = "car | truck ers ||van|||cycle"给出
"car|truck ers|van|cycle"https://stackoverflow.com/questions/11131044
复制相似问题