正则表达式.net风格

时间:2012-06-21 03:12:55

标签: asp.net regex special-characters

不要问这是如何运作的,但目前它确实("^\|*(.*?)\|*$") ......有点儿。这删除了所有额外的管道,第一部分,我已经搜索了所有没有anwser。我正在使用VB2011 beta,asp web form,vb编码!

我想捕获用于分隔单词(|)的特殊字符管car|truck|van|cycle

问题是用户经常使用,跟踪,使用多个,并在每个管道之前和之后使用空格,即|||car||truck | van || cycle

另一个例子:george bush|micheal jordon|bill gates|steve jobs< - 这是正确的,但当我删除空格时,它会取出正确的空格。

所以我想摆脱|之前|之前的空格,尾随,任何空格和(|)之后的空格,当然只允许一个管道{{1}}在字母数字字符之间。

2 个答案:

答案 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"