3

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

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

问题是用户经常在每个管道之前和之后使用空格、尾随、使用多个和使用空格,即|||car||truck | van || cycle.

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

所以我想去掉任何前导、尾随、前后的任何空格|,当然|只允许在字母数字字符之间使用一个管道(|)

4

2 回答 2

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

我的 regex-fu 不够强大,因为我认为这个 regex 可能会起作用,但它看起来是一项艰巨的工作。我记录了内联,但它仍然很复杂(而且它完全不起作用)

^(?:\|*)((?:\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-21T04:20:50.910 回答
1

我将从删除空间开始:

MyString = Regex.Replace(MyString, "[ ]*\|[ ]*", "|")

然后是多个管道:

MyString = Regex.Replace(MyString, "\|{2,}", "|")

例如

Dim MyString As String = "car  | truck ers  ||van|||cycle"

 "car|truck ers|van|cycle"
于 2012-06-21T04:24:30.883 回答