正则表达式 - 查找十六进制数字'匹配不包括下一个十六进制数字的0

时间:2015-04-17 22:30:43

标签: java regex

目标 - 我需要从输入字符串中检索所有十六进制数字。

示例输入和匹配 -

1-输入=" 0x480x8600x89dfh0x89BABCE" (""不包括在输入中)。 应该产生以下匹配:

  • 0x48(与0x480相对)
  • 0x860
  • 0x89df
  • 0x89BABCE

我试过这个模式:

"0[xX][\\da-fA-F]+"

但它导致以下匹配:

  • 0x480
  • 0x89df
  • 0x89BABCE

2-输入=" 0x0x8600x89dfh0x89BABCE" (""不包含在输入中)。

应该产生以下匹配:

  • 0x860
  • 0x89df
  • 0x89BABCE

这样的正则表达式可能吗?

我知道我可以先使用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());
        }

    }

}

2 个答案:

答案 0 :(得分:3)

  

有些人在面对问题时会想到,我知道,我会使用   正则表达式。"现在他们有两个问题    - 杰米·扎温斯基

如果您只使用.split("0x"),并在每个(非空)结果上回溯0x,那么您将完成。

答案 1 :(得分:1)

您可以使用lookahead检查下一个字符是否为" x"

String pattern = "0[xX]([1-9a-fA-F]|0(?![xX]))+";
但是,对于第二个示例,

不提供匹配为0x0。但是,您确实声明匹配应排除" 0"在下一个十六进制数之前,所以不确定为什么会匹配。