我对正则表达式不是很熟悉,遇到了一个超出我的问题。我希望能帮助你创建一个表达字符串的表达式然后获取所有内容但是从最后开始计算任意标记。
例如,我想从以下字符串中获取所有内容P037-077
http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-P037-077-GKV1032.html
这样做的一种方法是向后计数标记,分隔符为“ - ”(不保证字符串所需部分左侧有多少个标记)并获得第二个和第三个标记然后得到一切然后。
我得到表达式的90%-([^-]*-[^-]*)-[^-]*$
这会返回P037-077
,但我需要得到补充。
我不知道我是否已经解释得很好。如果有什么不清楚,我会很乐意再解释一下。
我知道这可以通过任何语言的标记来轻松完成,但遗憾的是我无法自由地执行此操作,因为我使用的工具仅使用正则表达式作为输入。它使用Java语法。
答案 0 :(得分:1)
当使用短划线作为分隔符时,这将删除第2个和第3个最后一个标记:
String cleaned = str.replaceAll("(-[^-]+){2}(?=-[^-]*$)", "");
这是一些测试代码:
String str = "http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-P037-077-GKV1032.html";
String cleaned = str.replaceAll("(-[^-]+){2}(?=-[^-]*$)", "");
System.out.println(cleaned);
输出:
http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-GKV1032.html
答案 1 :(得分:0)
使用群组
^(.*)-[^-]*-[^-]*(-[^-]*)$
$1$2
得到你想要的东西
String input="http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-P037-077-GKV1032.html";
Matcher m=Pattern.compile("^(.*)-[^-]*-[^-]*(-[^-]*)$").matcher(input);
if(m.find())
{
String output=m.group(1)+""+m.group(2);
}
答案 2 :(得分:0)
您正在寻找的是“非捕获群体”。一个组是()
中包含的任何内容。每个组都将用于匹配,也将包含在结果中。非捕获组是(?:)
中的任何一个(前三个字符作为左括号)。非捕获组将用于匹配,但不会包含在结果中。例如:
^(match_me)(?:but_not_me)$
如果你这么说:
1: match_me
2: match_mebut_not_me
它与第一个strinng不匹配,因为第二个部分不存在。但它会匹配第二个字符串,但会从匹配项中排除but_not_me
。
有关涉及网址的示例,请参阅“What is a non-capturing group? What does a question mark followed by a colon (?:) mean?”。