在java上使用正则表达式检索字符串

在java上使用正则表达式检索字符串,java,regex,expression,Java,Regex,Expression,我有以下几行: This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99. This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53. There should This reverts 518920b764ee9150781e68217181b24d0712748e commit. 如何使用java上的正则表达式仅检索数字: c289f6fa1f8642a5caf

我有以下几行:

This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99.
This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should
This reverts 518920b764ee9150781e68217181b24d0712748e commit.
如何使用java上的正则表达式
仅检索数字:

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e
建议:使用

如果您确实坚持使用正则表达式执行此操作,则可以使用以下正则表达式:

\b[a-f0-9]{40}\b
使用:

final Pattern sha1Pattern = Pattern.compile("\\b[a-f0-9]{40}\\b");

final Matcher matcher = sha1Pattern.matcher(yourInput);
if (matcher.find())
    // sha1 is accessed via matcher.group()
建议:使用

如果您确实坚持使用正则表达式执行此操作,则可以使用以下正则表达式:

\b[a-f0-9]{40}\b
使用:

final Pattern sha1Pattern = Pattern.compile("\\b[a-f0-9]{40}\\b");

final Matcher matcher = sha1Pattern.matcher(yourInput);
if (matcher.find())
    // sha1 is accessed via matcher.group()

如果需要完整的字母数字散列而不是数字,请考虑使用这个例子:

String test1 = "This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99.";
String test2 = "This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should";
String test3 = "This reverts 518920b764ee9150781e68217181b24d0712748e commit.";
Pattern pattern = Pattern.compile("reverts\\s(commit\\s)*(.+?)[\\.\\s]");
Matcher matcher = pattern.matcher(test1);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
matcher = pattern.matcher(test2);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
matcher = pattern.matcher(test3);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
输出:

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e

如果需要完整的字母数字散列而不是数字,请考虑使用这个例子:

String test1 = "This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99.";
String test2 = "This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should";
String test3 = "This reverts 518920b764ee9150781e68217181b24d0712748e commit.";
Pattern pattern = Pattern.compile("reverts\\s(commit\\s)*(.+?)[\\.\\s]");
Matcher matcher = pattern.matcher(test1);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
matcher = pattern.matcher(test2);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
matcher = pattern.matcher(test3);
if (matcher.find()) {
    System.out.println(matcher.group(2));
}
输出:

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e

这个还原(?:提交)([a-f\\d]+)
怎么样?这应将搜索到的零件存储在组1中

String data="This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99." +
        "This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should" +
        "This reverts 518920b764ee9150781e68217181b24d0712748e commit.";

Matcher m = Pattern.compile("This reverts (?:commit )?([a-f\\d]+)").matcher(data);
while(m.find())
    System.out.println(m.group(1));
输出:

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e

这个还原(?:提交)([a-f\\d]+)怎么样?这应将搜索到的零件存储在组1中

String data="This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99." +
        "This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should" +
        "This reverts 518920b764ee9150781e68217181b24d0712748e commit.";

Matcher m = Pattern.compile("This reverts (?:commit )?([a-f\\d]+)").matcher(data);
while(m.find())
    System.out.println(m.group(1));
输出:

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e

这看起来像是检索40个字母数字字符序列的小技巧。使用此模式
\p{Alnum}{40}
;测试字符串中唯一匹配的是提交编号

static final String[] data = new String[] {
    "This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99.",
    "This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should",
    "This reverts 518920b764ee9150781e68217181b24d0712748e commit."
};
public static void main (String[] args) throws java.lang.Exception {
    Pattern p = Pattern.compile("\\p{Alnum}{40}");
    for (String s : data) {
        Matcher m = p.matcher(s);
        if (m.find()) {
             System.out.println(m.group());   
        }
    }
}
这张照片

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e

.

检索40个字母数字字符的序列似乎需要一些技巧。使用此模式
\p{Alnum}{40}
;测试字符串中唯一匹配的是提交编号

static final String[] data = new String[] {
    "This reverts commit c289f6fa1f8642a5caf728ef8ff87afd5718cd99.",
    "This reverts commit c7740a943ec896247ebc5514b6be02710caf3c53.  There should",
    "This reverts 518920b764ee9150781e68217181b24d0712748e commit."
};
public static void main (String[] args) throws java.lang.Exception {
    Pattern p = Pattern.compile("\\p{Alnum}{40}");
    for (String s : data) {
        Matcher m = p.matcher(s);
        if (m.find()) {
             System.out.println(m.group());   
        }
    }
}
这张照片

c289f6fa1f8642a5caf728ef8ff87afd5718cd99
c7740a943ec896247ebc5514b6be02710caf3c53
518920b764ee9150781e68217181b24d0712748e

.

我认为,与匹配代表十六进制数的40个字符的序列相比,您做得再好不过了

下面是一个完整的示例(可以细化,但这是一个想法):


但我可能错了…

我认为,与匹配代表十六进制数的40个字符的序列相比,你做得再好不过了

下面是一个完整的示例(可以细化,但这是一个想法):



但是我可能错了…

所以你想去掉所有的单词和
?您可以使用
String#split(\\s+)
如果您想在Java中操作git存储库,
c
不是一个数字。你是说十六进制。你确定在这种上下文中只有这些哈希吗?如果你想管理所有的GIT消息,搜索“回复”是不够的……那么你想去掉所有的单词和
?您可以使用
String#split(\\s+)
如果您想在Java中操作git存储库,
c
不是一个数字。你是说十六进制。你确定在这种上下文中只有这些哈希吗?如果你打算管理所有的GIT消息,搜索“回复”是不够的…我不知道任何40个字母的单词只包含a-f字母,这可能会导致误报结果,所以+1:)顺便说一句,你可能想将20改为40@Pshemo哎呀。。。我似乎总是忘记每个字节需要两个十六进制数字:pIt不工作!您可能会在正则表达式上出错吗?@Mehdi没有理由认为它不应该工作,但同样,如果我要用Java操作git存储库,我会选择JGit;)@Mehdi是的,20岁是原因
\\b
是单词锚,而
[a-f0-9]
是字符类
{n}
是一个量词,意思是“恰好
n
次”。我不知道任何40个字母的单词只包含a-f字母,可能会给出假阳性结果,所以+1:)顺便说一句,您可能想将20改为40@Pshemo哎呀。。。我似乎总是忘记每个字节需要两个十六进制数字:pIt不工作!您可能会在正则表达式上出错吗?@Mehdi没有理由认为它不应该工作,但同样,如果我要用Java操作git存储库,我会选择JGit;)@Mehdi是的,20岁是原因
\\b
是单词锚,而
[a-f0-9]
是字符类
{n}
是一个量词,意思是“正好
n
次”我认为哈希值只由十六进制数组成,因此你可以更严格地限制:[a-f0-9]我认为哈希值只由十六进制数组成,因此你可以更严格地限制:[a-f0-9]如果不够通用,这种散列可能会出现在OP所展示的信息之外的其他信息中,但对于这一子集很好。@Pragmateek True,但如果不知道这个问题的真正目的,很难给出更一般的答案。fge的答案可能是关闭,但我不确定OP输入是否不会有像
caaaaaafeeeeee这样的字符串(重复e直到40个字母的单词)
:)对。这么长的单词会很糟糕,即使在法语中我们也没有;)但是如果是为了管理一些与化学工业相关的代码:如果没有“i”@Pragmateek,那么应该是可能的好代码:D。我还想知道OP input是否不会有任何只包含a-f字符的化学公式,比如
Ac B Ba be C Ca Cd Ce Cf Db f Fe
和数字:)这不够通用,这种散列可能会出现在OP所展示的信息之外的其他信息中,但对于这一子集很好。@Pragmateek True,但如果不知道这个问题的真正目的,很难给出更一般的答案。fge的答案可能是关闭,但我不确定OP输入是否不会有像
caaaaaafeeeeee这样的字符串(重复e直到40个字母的单词)
:)对。这么长的单词会很糟糕,即使在法语中我们也没有;)但是如果是为了管理一些与化学工业相关的代码:如果没有“i”@Pragmateek,那么应该可以使用好的代码:D。我还想知道OP输入是否不会有任何只包含a-f字符的化学公式,例如
Ac B Ba be C Ca Cd Ce Cf Db f Fe
和数字:)