我对reg-ex很新,我不确定这个是怎么回事......但是我的朋友给了我这个来解决我的问题,但不管怎么说它不起作用......
string: department_name:womens AND item_type_keyword:base-layer-underwear
reg-ex: (department_name:([\\w-]+))?(item_type_keyword:([\\w-]+))?
所需的输出:数组或组
第四名:基层内衣
字符串可以包含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
不知怎的,它重复了第一和第二元素,我不知道为什么。但它没有返回我期望的其他元素..
有人可以帮我吗......
当我在网上测试正则表达式时,它对我来说很好......
由于
答案 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启用多个匹配,以使它们匹配的顺序无关紧要,或匹配的数量。)
(?:
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-]+))
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);
}
答案 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-]+)
试试这个。这使用前瞻捕获然后回溯并再次捕获。参见演示。