遇到 Java 正则表达式的问题。

huangapple go评论59阅读模式
英文:

Having problems with java regex

问题

我有以下的正则表达式:

/[-A-Z]{4}\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}.png

基本上,我想检查基本类型的字符串:

ABCD12/<这里是一个随机的 UUID 作为字符串>.png

UUID(大写)的检查正常工作,但现在让我们看一个特殊情况。我想要接受以下类型的字符串:

--CD12/...
AB--12/...

但不想接受这样的:

A--D12/...

但是我无法得到正则表达式的第一部分正确。基本上,我需要检查每个两个数字或两个 - 重复两次。

根据我的理解,[-A-Z]{4} 意味着 "要么是 -,要么是 A 到 Z 之间的字符,长度为 4"。所以为什么我的模式不起作用?

编辑:
在评论中发布了这个答案,它可以工作:

(?mi)^(?:--[A-Z]{2}|[A-Z]{2}(?:--|[A-Z]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$

有人能解释一下 (?mi)(?:...) 是什么意思吗?正常的 ? 表示出现 0 次或 1 次,但 : 有什么作用?

编辑 2:
只是为了那些可能有类似问题但不想阅读所有这些正则表达式的人 遇到 Java 正则表达式的问题。 我稍微修改了一个答案,以便接受像 ----12 这样的模式。最终结果是:

"^/(?:--[A-Z]{2}|-{4}|[A-Z]{2}(?:--|[A-Z]{2}))\\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\\.png$"

它运行得非常好。

英文:

I have the following regex:

/[-A-Z]{4}\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}.png

Basically I want to check for strings of the basic type

ABCD12/&lt;here_is_a_random_uuid_as_a_string&gt;.png

The UUID (which is in UPPER CASE) checking works fine, but now let's take a look at a special case. I want to accept strings like this

--CD12/...
AB--12/...

but NOT like this:

A--D12/...

But I can not get the first part of the regex right. Basically I need to check for either two digits or two -after each other twice.

For my understanding [-A-Z]{4} means "either - or something between A - Z with a length of 4". So why doesn't my pattern work?

EDIT:
This answer was posted within the comments and it works:

(?mi)^(?:--[A-Z]{2}|[A-Z]{2}(?:--|[A-Z]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$

Can somebody explain to me what (?mi) and what (?:...) means? The normal ? means 0 or 1 time, but what is the : for?

EDIT 2:
Just for those how might have a similar problem and do not want to read all of those regexes 遇到 Java 正则表达式的问题。
I slightly modified an answer to also accept patterns like ----12. The end result:

&quot;^/(?:--[A-Z]{2}|-{4}|[A-Z]{2}(?:--|[A-Z]{2}))\\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\\.png$&quot;

It works like a charm.

答案1

得分: 2

你可以在你的情况下使用这个正则表达式:

^(?:--[A-Z]{2}|[A-Z]{2}(?:--|[A-Z]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$

正则表达式演示

有关第一部分的详细信息:

  • ^:开头
  • (?::开始非捕获组
    • --[A-Z]{2}:匹配 -- 后面跟着 2 个字母
    • |:或者
    • [A-Z]{2}:匹配 2 个字母
    • (?:--|[A-Z]{2}):匹配 -- 或者 2 个字母
  • ):结束非捕获组

顺便说一下,(?:...) 是非捕获组。

英文:

You may use this regex for your cases:

^(?:--[A-Z]{2}|[A-Z]{2}(?:--|[A-Z]{2}))\d{2}/[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}\.png$

RegEx Demo

Details about first part:

  • ^: Start
  • (?:: Start non-capture group
    • --[A-Z]{2}: Match -- followed by 2 letters
    • |: OR
    • [A-Z]{2}: Match 2 letters
    • (?:--|[A-Z]{2}): Match -- OR 2 letters
  • ): End non-capture group

btw (?:...) is non-capture group.

答案2

得分: 1

你的 [-A-Z]{4} 匹配任意四个大写 ASCII 字母或 -,因此它也可以匹配 ----A------B-B-- 等。

你想确保如果有连字符,它们出现在两个字母之前或之后:

(?:[A-Z]{2}--|--[A-Z]{2}|[A-Z]{4})

它的意思是:

  • (?: - 开始一个非捕获组:
    • [A-Z]{2}-- - 两个大写 ASCII 字母,然后是 --
    • | - 或者
    • --[A-Z]{2} - --,然后是任意两个大写 ASCII 字母
    • | - 或者
    • [A-Z]{4} - 任意四个大写 ASCII 字母
  • ) - 结束非捕获组。

完整的模式:

(?:[A-Z]{2}--|--[A-Z]{2}|[A-Z]{4})\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.png

为了强制整个字符串匹配,添加 ^(字符串开头)和 $(字符串结尾)锚点:

^(?:[A-Z]{2}--|--[A-Z]{2}|[A-Z]{4})\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.png$

注意,. 匹配任意字符,如果要匹配字面上的句点,应该对其进行转义。

英文:

Your [-A-Z]{4} matches any four occurrences of an uppercase ASCII letter or -, so it can also match ----, A---, ---B, -B--, etc.

You want to make sure that if there are hyphens, they come after or before two letters:

(?:[A-Z]{2}--|--[A-Z]{2}|[A-Z]{4})

It means:

  • (?: - start of a non-capturing group:
    • [A-Z]{2}-- - two uppercase ASCII letters and then --
    • | - or
    • --[A-Z]{2} - -- and then any two uppercase ASCII letters
    • | - or
    • [A-Z]{4} - any four uppercase ASCII letters
  • ) - end of the non-capturing group.

The full pattern:

(?:[A-Z]{2}--|--[A-Z]{2}|[A-Z]{4})\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.png

To force the entire string match, add ^ (start of string) and $ (end of string) anchors:

^(?:[A-Z]{2}--|--[A-Z]{2}|[A-Z]{4})\d{2}/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\.png$

See the regex demo

Note the . matches any char, to match a literal dot, you should escape it.

huangapple
  • 本文由 发表于 2020年9月10日 04:28:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/63819117.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定