【问题标题】:c# String filtering and split with regex matchc# 使用正则表达式匹配字符串过滤和拆分
【发布时间】:2017-01-09 20:41:54
【问题描述】:

我正在尝试使用正则表达式过滤字符串,但我对正则表达式不太熟悉,所以我需要一些帮助。我还需要检查字符串是否包含特定的正则表达式部分,例如下面的输入示例:

输入(字符串):

"<value1;127.0.0.1:20000;value2;value3>Lorem ipsum dolor sit amet!"

如果存在则返回这些值:

string val1 = ????; //can't be null or empty, must be at least 3 chars/ints
string val2 = ????; //can be empty string
string val3 = ????; //can be empty string
string ipaddress = ????; // can't be empty
string text = ????; //can be empty string

否则,如果不存在,则仅返回“lorem ipsum...”文本:

string text = ????; //can be empty string

所以首先我需要检查特定部分 是否存在于完整字符串中。 字符串可以没有那部分。

请有人解释一下我该怎么做?

编辑: (请不要判断,我对正则表达式真的很不好) 这是我尝试过的:

private static bool ifContain(string a)
{
    return Regex.IsMatch(a, @"([a-zA-Z0-9]*)\;([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{5})([a-zA-Z0-9*)\;([a-zA-Z0-9]*)\;([<a-zA-Z0-9]*)");
}

【问题讨论】:

标签: c# regex string if-statement filtering


【解决方案1】:

这是一种结合正则表达式和拆分的方法。我没有进行任何 null/empty/whitespace 验证,也没有验证 split 结果是否包含至少 4 个元素。这使用捕获组从匹配中选择文本,它只是盲目地使用.* 捕获组中的所有文本,其中组用括号定义。

        string txt = "<value1;127.0.0.1:20000;value2;value3>Lorem ipsum dolor sit amet!";
        var rgx = new Regex(@"<(.*)>(.*)");
        var match = rgx.Match(txt);
        // Should check if (match.Success) here and only continue if true
        var entireMatch = match.Groups[0]; // unused
        var firstCaptureGroup = match.Groups[1].Value; // Everything between < >
        var secondCaptureGroup = match.Groups[2].Value; // Everything after < >
        var split = firstCaptureGroup.Split(';');

        string val1 = split[0]; 
        string val2 = split[2]; 
        string val3 = split[3]; 
        string ipaddress = split[1]; 
        string text = secondCaptureGroup;

【讨论】:

  • 由于我的 ifContain 方法现在可以工作(由于某种原因之前没有工作),这就是我要拆分的内容。谢谢。
  • 好吧,看看我的小修改,有很多验证要做,其中之一是检查 match.Success 属性,因为如果它是假的,那么没有理由尝试继续。
【解决方案2】:

丑陋的方式without正则表达式:

var str = "<value1;127.0.0.1:20000;value2;value3>Lorem ipsum dolor sit amet!";

var split = str.Split(';'); 
var split2 = split[3].Split('>');

var val1 = split[0].Split('<')[1];
var ip = split[1];
var val2 = split[2];    
var val3 = split2[0];
var text = split2[1];

如果由于某种原因这些值中的任何一个不存在,您可以在之后使用string.IsNullOrWhiteSpace() 函数进行检查

例如:

var str = "<;;;>";

var split = str.Split(';');

var val1 = split[0].Split('<')[1];

Console.WriteLine(string.IsNullOrWhiteSpace(val1)); //true

【讨论】:

  • 感谢您的回答。我知道如何拆分它,但我在想可能有一些不同的方法可以使用正则表达式来做到这一点,因为这些字符串有时会包含该特定部分,所以我需要检查该部分是否存在,如果存在则拆分它。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2015-03-15
  • 2018-09-25
  • 2022-11-30
相关资源
最近更新 更多