[英]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 OR item_type_keyword,但不是任何顺序的修饰
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
不知怎的,它重复第一和第二元素,我不知道为什么。 但它没有返回我期望的其他元素..
有人能帮助我吗...
当我在网上测试正则表达式时,它看起来很好......
谢谢
你可以使用这样的东西来获得你的问题中的输出:
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()
(这更适合单个匹配,而在这里我启用多个匹配,所以他们匹配的顺序不无所谓,或匹配的数量)。
(?:
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-]+))
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);
}
另一个想法是使用前瞻来捕获并获取一个匹配中的所有组:
^(?!$)(?=.*(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-]+)
试试这个。这使用前瞻捕获然后回溯并再次捕获。参见演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.