不要问这是如何运作的,但目前它确实("^\|*(.*?)\|*$")
......有点儿。这删除了所有额外的管道,第一部分,我已经搜索了所有没有anwser。我正在使用VB2011 beta,asp web form,vb编码!
我想捕获用于分隔单词(|)
的特殊字符管car|truck|van|cycle
。
问题是用户经常使用,跟踪,使用多个,并在每个管道之前和之后使用空格,即|||car||truck | van || cycle
。
另一个例子:george bush|micheal jordon|bill gates|steve jobs
< - 这是正确的,但当我删除空格时,它会取出正确的空格。
所以我想摆脱|
之前|
之前的空格,尾随,任何空格和(|)
之后的空格,当然只允许一个管道{{1}}在字母数字字符之间。
答案 0 :(得分:1)
这些是一些样本输入 - >输出:
"|||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分钟,自从我编辑了试图使正则表达式工作的帖子以来,所有内容都是如此。故事的寓意:只做你必须做的工作,你不必使用正则表达式。
答案 1 :(得分:1)
我首先要删除空格:
MyString = Regex.Replace(MyString, "[ ]*\|[ ]*", "|")
然后是多个管道:
MyString = Regex.Replace(MyString, "\|{2,}", "|")
例如
Dim MyString As String = "car | truck ers ||van|||cycle"
给出
"car|truck ers|van|cycle"