目标 - 我需要从输入字符串中检索所有十六进制数字。
示例输入和匹配 -
1-输入=" 0x480x8600x89dfh0x89BABCE" (""不包括在输入中)。 应该产生以下匹配:
我试过这个模式:
"0[xX][\\da-fA-F]+"
但它导致以下匹配:
2-输入=" 0x0x8600x89dfh0x89BABCE" (""不包含在输入中)。
应该产生以下匹配:
这样的正则表达式可能吗?
我知道我可以先使用String.split(" 0 [xX]")拆分我的输入,然后对于每个String我可以写逻辑来检索第一个有效匹配,如果有的话是一个。
但我想知道我是否只使用模式和匹配器就可以达到预期的效果。
这是我目前的代码。
package toBeDeleted;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String pattern = "0[xX][\\da-fA-F]+";
String input = "0x480x860x89dfh0x89BABCE";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println("Starting at : " + m.start()
+ ", Ending at : " + m.end()
+ ", element matched : " + m.group());
}
}
}
答案 0 :(得分:3)
有些人在面对问题时会想到,我知道,我会使用 正则表达式。"现在他们有两个问题 - 杰米·扎温斯基
如果您只使用.split("0x")
,并在每个(非空)结果上回溯0x,那么您将完成。
答案 1 :(得分:1)
您可以使用lookahead检查下一个字符是否为" x"
String pattern = "0[xX]([1-9a-fA-F]|0(?![xX]))+";
但是,对于第二个示例,不提供匹配为0x0。但是,您确实声明匹配应排除" 0"在下一个十六进制数之前,所以不确定为什么会匹配。