繁体   English   中英

c#中需要REGEX帮助

[英]REGEX help needed in c#

在此输入图像描述 我对reg-ex很新,我不确定这个是怎么回事......但是我的朋友给了我这个解决我的问题,但不管怎么说它不起作用....

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

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

期望的输出:数组OR组

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

    字符串可以包含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

谢谢

你可以使用这样的东西来获得你的问题中的输出:

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() (这更适合单个匹配,而在这里我启用多个匹配,所以他们匹配的顺序不无所谓,或匹配的数量)。

ideone演示


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

最好使用交替(或逻辑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

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

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

作为.NET字符串

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

在regexplanet测试 (点击.NET); 在regex101.com上测试

(如果多行输入,则添加m多行修改器: "^(?m) ...)

如果您使用任何可以使用And Or等的拆分

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

•1:department_name:女性•2:女性•3:item_type_keyword:基层内衣•4:基层内衣

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM