c#中需要REGEX帮助

时间:2014-09-26 09:45:16

标签: c# regex

enter image description here我对reg-ex很新,我不确定这个是怎么回事......但是我的朋友给了我这个来解决我的问题,但不管怎么说它不起作用......

string: department_name:womens AND item_type_keyword:base-layer-underwear

reg-ex: (department_name:([\\w-]+))?(item_type_keyword:([\\w-]+))?

所需的输出:数组或组

  • 第一个元素应该是:department_name:womens
  • 第二名应该是:女性
  • 3rd:item_type_keyword:base-layer-underwear
  • 第四名:基层内衣

    字符串可以包含department_name OR item_type_keyword,但不是任何顺序的修饰

C#代码

Regex regex = new Regex(@"(department_name:([\w-]+))?(item_type_keyword:([\w-]+))?");
Match match = regex.Match(query);
if (match.Success)
    if (!String.IsNullOrEmpty(match.Groups[4].ToString()))
        d1.ItemType = match.Groups[4].ToString();

这个C#代码只返回带有3个元素的字符串数组

1: department_name:womens
2: department_name:womens
3: womens

不知怎的,它重复了第一和第二元素,我不知道为什么。但它没有返回我期望的其他元素..

有人可以帮我吗......

当我在网上测试正则表达式时,它对我来说很好......

http://fiddle.re/crvw1

由于

5 个答案:

答案 0 :(得分:3)

您可以使用类似的内容来获得问题中的输出:

string txt = "department_name:womens AND item_type_keyword:base-layer-underwear";
var reg = new Regex(@"(?:department_name|item_type_keyword):([\w-]+)", RegexOptions.IgnoreCase);
var ms = reg.Matches(txt);
ArrayList results = new ArrayList();
foreach (Match match in ms)
{
    results.Add(match.Groups[0].Value);
    results.Add(match.Groups[1].Value);
}

// results is your final array containing all results
foreach (string elem in results)
{
    Console.WriteLine(elem);
}

打印:

department_name:womens
womens
item_type_keyword:base-layer-underwear
base-layer-underwear

match.Groups[0].Value给出与模式匹配的部分,而match.Groups[1].Value将给出模式中捕获的部分。

在第一个表达式中,您有2个捕获组;因此,为什么你出现了两次department_name:womens

获得不同的元素后,您应该能够将它们放入数组/列表中进行进一步处理。(在编辑中添加此部分)

循环然后允许您迭代每个匹配,这不能与if.Match()完全匹配(这更适合单个匹配,而在这里我' m启用多个匹配,以使它们匹配的顺序无关紧要,或匹配的数量。)

ideone demo


(?:
  department_name     # Match department_name
|                     # Or
  item_type_keyword   # Match item_type_keyword
)
:
([\w-]+)              # Capture \w and - characters

答案 1 :(得分:2)

最好使用交替(或逻辑OR)运算符|,因为我们不知道输入字符串的顺序。

(department_name:([\w-]+))|(item_type_keyword:([\w-]+))

DEMO

String input = @"department_name:womens AND item_type_keyword:base-layer-underwear";
Regex rgx = new Regex(@"(?:(department_name:([\w-]+))|(item_type_keyword:([\w-]+)))");
foreach (Match m in rgx.Matches(input))
{
Console.WriteLine(m.Groups[1].Value);
Console.WriteLine(m.Groups[2].Value);
Console.WriteLine(m.Groups[3].Value);
Console.WriteLine(m.Groups[4].Value);
}

IDEONE

答案 2 :(得分:2)

另一个想法是使用lookahead来捕获并获取一个匹配中的所有组:

^(?!$)(?=.*(department_name:([\w-]+))|)(?=.*(item_type_keyword:([\w-]+))|)

作为.NET字符串

"^(?!$)(?=.*(department_name:([\\w-]+))|)(?=.*(item_type_keyword:([\\w-]+))|)"

test at regexplanet(点击.NET); test at regex101.com

(如果多行输入,请添加m多行修饰符:"^(?m) ...)

答案 3 :(得分:1)

如果你使用和Or等分割,你可以使用

(department_name:(.*?)) AND (item_type_keyword:(.*?)$)

•1:department_name:女性 •2:女性 •3:item_type_keyword:base-layer-underwear •4:基层内衣

答案 4 :(得分:0)

(?=(department_name:\w+)).*?:([\w-]+)|(?=(item_type_keyword:.*)$).*?:([\w-]+)

试试这个。这使用前瞻捕获然后回溯并再次捕获。参见演示。

http://regex101.com/r/lS5tT3/52