【问题标题】:Regex to extract the search term in search phrase正则表达式提取搜索短语中的搜索词
【发布时间】:2009-11-23 12:06:49
【问题描述】:

我有以下搜索词组,我需要提取

  1. ABC XYZ
  2. 手机配件
  3. 三星250

只要它们以任何顺序出现在字符串中。该应用程序是 C# .Net。

Search Phrase
__________________________________________________________
ABC XYZ
ABC XYZ category:"Mobile Accessories"
category:"Mobile Accessories" ABC XYZ
ABC XYZ Model:"Samsung 250"
Model:"Samsung 250" ABC XYZ
ABC XYZ category:"Mobile Accessories" Model:"Samsung 250"
Model:"Samsung 250" category:"Mobile Accessories" ABC XYZ
category:"Mobile Accessories" Model:"Samsung 250" ABC XYZ
__________________________________________________________

提前致谢。

示例 1 输入 - ABC XYZ 类别:“移动配件” 输出 - ABC XYZ 和移动配件

示例 2 输入 - 型号:“Samsung 250”类别:“手机配件”ABC XYZ 输出 - 三星 250、移动配件和 ABC XYZ

示例 3 输入 - ABC XYZ 输出 - ABC XYZ

示例 4 输入 - 型号:“Samsung 250”ABC XYZ 输出 - 三星 250 和 ABC XYZ

【问题讨论】:

  • 抱歉,这完全没有意义。尝试显示您的实际输入和预期输出的 sn-p。

标签: c# regex search phrase


【解决方案1】:

如果您确实想查找显式字符串,IndexOf 方法将适合您(例如:s.IndexOf("ABC XYZ"))。

你显示的语法看起来有点像 field:"value" 语法,所以也许你想要一个像 "([a-z]+):\"([^"]+)\"" 的正则表达式(应该成对匹配字段和值)。

如果那不是你想要的对不起,但问题有点含糊。

【讨论】:

  • 不错的一个。 IndexOf 的优点。我假设 OP 想要提取示例中的特定密钥,但您的想法同样有效。 +1。
【解决方案2】:

至于模型和类别,您可以使用类似的方法来捕获它们:

类别:“([^”]*)“

这将搜索字符串category:",后跟您的类别(可能会更改,然后是另一个"。当然,在c#中应该转义:@"category:""([^""]*)"""
相似之处,可以提取Model:Model:"([^"]*)"

不确定其余的,但如果你删除这两个,你就剩下空闲的字符串了。

【讨论】:

  • 你能告诉我如何排除这两个,以便我可以留下剩余的空闲字符串。
  • 您可以使用Regex.Replace 删除匹配的字符串,或@fyjham 显示的所有key:"value" 对。这样一来,您就需要对三个值进行三个调用,这还不错。
  • 您还可以选择遍历从正则表达式匹配返回的 Match.Groups,并结合使用每个匹配的索引和长度属性以及子字符串来提取不匹配的内容。您是否会为此烦恼取决于您的正则表达式的性能密集程度(如果您希望非常频繁地调用它,这将比更多的正则表达式调用提供更好的性能,但需要更多代码)。
【解决方案3】:

您似乎想从同一个字符串中提取几个不同的模式。一 方法是找到每个匹配项,然后将其从工作字符串中删除。

例子:

String workingstring = "ABC XYZ category:\"Mobile Accessories\"";

Regex categoryMatch("category:\"([^\"]+)\"");
Regex modelMatch("model:\"([^\"]+)\"");

String category = categoryMatch.Match(workingstring);
String model = modelMatch.Match(workingstring);

workingstring = Regex.Replace(workingstring, categoryMatch, "");
workingstring = Regex.Replace(workingstring, modelMatch, "");

String name = workingstring; //I assume that the extra data is the name

这将提取类别、型号和名称,而不管字符串的格式如何。您应该注意格式错误的字符串,例如:

ABC Model:"Samsung 250" XYZ

将返回:

ABC  XYZ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多