0

我对正则表达式不是很熟悉,遇到了一个我无法解决的问题。我想帮助我想出一个对字符串进行标记的表达式,然后让我得到所有东西,但从最后开始计数的任意标记。

例如,我想P037-077从以下字符串中获取所有内容

http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-P037-077-GKV1032.html

一种方法是开始倒数记号,分隔符为“-”(无法保证字符串所需部分左侧有多少记号)并获取第二个和第三个记号,然后得到一切,但那。

我得到了 90% 的表达式-([^-]*-[^-]*)-[^-]*$This 返回P037-077,但我需要得到它的补码。

不知道我解释的好不好。如果有任何不清楚的地方,我很乐意再次解释。

我知道这可以通过任何语言的标记轻松完成,但不幸的是我没有这样做的自由,因为我使用的工具只接受正则表达式作为输入。它使用 Java 语法。

4

3 回答 3

1

当使用破折号作为分隔符时,这将删除倒数第二个和第三个标记:

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

于 2013-10-25T05:18:03.960 回答
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);
}
于 2013-10-25T03:15:27.063 回答
0

您正在寻找的是“非捕获组”。组是任何包含在(). 每个组都将用于匹配,也将包含在结果中。非捕获组是包含在其中的任何内容(?:)(前三个字符用作左大括号)。非捕获组将用于匹配,但不会包含在结果中。例子:

^(match_me)(?:but_not_me)$

如果你应用它说:

1: match_me
2: match_mebut_not_me

它与第一个字符串不匹配,因为第二部分不存在。但它会匹配第二个字符串,但会but_not_me从匹配中排除。有关涉及 url 的示例,请参阅“什么是非捕获组?问号后跟冒号 (?:) 是什么意思? ”。

于 2013-10-25T08:14:24.840 回答