标签: regex-group

正则表达式不捕获预期组中的匹配

我一直在处理需求,我需要在以下字符串上创建一个正则表达式:

startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]
Run Code Online (Sandbox Code Playgroud)

这个字符串可以有很多变化,如下所示:

startDate:[*;2016-10-12T12:23:23Z]
startDate:[2016-10-12T12:23:23Z;*]
startDate:[*;*]
Run Code Online (Sandbox Code Playgroud)

startDate在上面的表达式中是一个键名,可以是endDate,updateDate等,这意味着我们不能在表达式中硬编码.密钥名称可以被接受为任何单词[a-zA-Z_0-9]*

我使用以下编译模式

Pattern.compile("([[a-zA-Z_0-9]*):(\\[[[\\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]];[[\\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]]\\]])");
Run Code Online (Sandbox Code Playgroud)

模式匹配,但创建的组不是我所期望的.我希望下面用括号括起来的组:

(startDate):([*:2016-10-12T12:23:23Z])

group1 = "startDate"
group2 = "[*;2016-10-12T12:23:23Z]"
Run Code Online (Sandbox Code Playgroud)

你能帮我在Java和小组中正确表达吗?

java regex regex-group

6
推荐指数
1
解决办法
136
查看次数

Groovy:替换捕获组的惯用方法

我有一个这样的字符串:docker login -u username -p password docker-registry-url.

我用Groovy脚本执行命令execute.出于调试目的,我在执行前打印命令,但由于它包含敏感数据,因此我对用户名和密码进行了模糊处理.

def printableCmd = cmd.toString()

def m = printableCmd =~ /(?:.+) -u (.+) -p (.+) (?:.+)/

if (m.matches() && m[0].size() >= 3) {
  printableCmd = m[0][-1..-2].inject(m[0][0]) { acc, val -> acc.replaceAll(val, "***") }
}
Run Code Online (Sandbox Code Playgroud)

上面的工作正如预期和打印docker login -u *** -p *** docker-registry-url,但我想知道是否有更惯用的方式来做到这一点.请注意,我不想删除捕获的组,只需用星号替换它们,因此非常清楚命令没有错误,但出于安全目的进行模糊处理.

java regex groovy regex-group

6
推荐指数
1
解决办法
4231
查看次数

如何强制两个模式捕获到正则表达式中的同一组

我必须解析一个字符串,格式为!info1!info2!,并且info2是可选的。

我正在尝试使用正则表达式来捕获,info1如果info2需要的话。

我想出了以下模式:

!([^!]*?)!(.*?)!|!(.*?)! 
Run Code Online (Sandbox Code Playgroud)

它有效,但我对结果不满意:

!foo!bar! -> Group1: foo Group2:bar
!foo!     -> Group3: foo
(https://regex101.com/r/D9d6YP/1)
Run Code Online (Sandbox Code Playgroud)

在这两种表达方式中,foo表示相同的事物,并且随后以相同的方式进行处理。我想将它捕获在同一组中,无论是否有第二组。

我尝试过使用命名捕获组,但似乎它们无法重复使用

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!
Run Code Online (Sandbox Code Playgroud)

失败并显示错误消息“子模式名称必须是唯一的”。

有什么办法可以捕获同一组中的不同模式吗?

.net regex regex-group

6
推荐指数
1
解决办法
3110
查看次数

正则表达式从带有顺序组的分隔字符串解析

我正在尝试从分隔的字符串中解析出单词,并按顺序排列捕获组.例如

dog.cat.chicken.horse.whale

我知道([^.]+)哪个可以解析每个单词但是这会将每个字符串放在捕获组1中.

Match 1
Full match  0-3 `dog`
Group 1.    0-3 `dog`
Match 2
Full match  4-7 `cat`
Group 1.    4-7 `cat`
Match 3
Full match  8-15    `chicken`
Group 1.    8-15    `chicken`
Match 4
Full match  16-21   `horse`
Group 1.    16-21   `horse`
Match 5
Full match  22-27   `whale`
Group 1.    22-27   `whale`
Run Code Online (Sandbox Code Playgroud)

我真正需要的是类似的东西

Match 1
Full match  0-27    `dog.cat.chicken.horse.whale`
Group 1.    0-3 `dog`
Group 2.    4-7 `cat`
Group 3.    8-15    `chicken`
Group 4.    16-21   `horse`
Group 5. …
Run Code Online (Sandbox Code Playgroud)

regex regex-group prometheus

6
推荐指数
1
解决办法
105
查看次数

当我从条件组中省略"else"时,为什么.NET的正则表达式引擎表现得如此奇怪?

码:

Match match = Regex.Match("abc", "(?(x)bx)");
Console.WriteLine("Success: {0}", match.Success);
Console.WriteLine("Value: \"{0}\"", match.Value);
Console.WriteLine("Index: {0}", match.Index);
Run Code Online (Sandbox Code Playgroud)

输出:

Success: True
Value: ""
Index: 1
Run Code Online (Sandbox Code Playgroud)

似乎没有"else"表达式的条件组将改为从"if"表达式的第一个字符创建一个前瞻,并将其用作"else".在这种情况下,它将像正则表达式一样运行(?(x)bx|(?=b))

****在这里发生了什么?这是故意的吗?它似乎没有记录.

编辑:已在corefx存储库中创建了一个问题:https://github.com/dotnet/corefx/issues/26787

.net c# regex regex-group regex-lookarounds

6
推荐指数
1
解决办法
146
查看次数

捕获组中的负向后看

我正在尝试编写一些正则表达式,以使我可以对捕获组进行隐式查找,以便可以从电子邮件中提取可能的引用。我需要知道如何从某个角度看向第一个空白。如果找到一个数字,我不希望提取引用。

我已经达到如下所示。我有2个捕获组-'PreRef'和'Ref'。如果'PreRef'包含数字,我不希望找到'Ref'匹配项。到目前为止,我只检查冒号前面的字符是否为数字。

(?<PreRef>\S+)(?<![\d]):(?<Ref>\d{5})
Run Code Online (Sandbox Code Playgroud)

此处的“参考”匹配为12345:

This is a reference:12345
Run Code Online (Sandbox Code Playgroud)

但是不是这里(“引用”一词中有5):

This is not a ref5rence:12345
Run Code Online (Sandbox Code Playgroud)

regex regex-group regex-lookarounds

6
推荐指数
1
解决办法
1592
查看次数

替换文本中大于 5 位的数字

a <- c("this is a number 9999333333 and i got 12344")
Run Code Online (Sandbox Code Playgroud)

我如何将大于 5 位的数字替换为额外的数字为“X”

预期输出:

"this is a number 99993XXXXX and i got 12344"
Run Code Online (Sandbox Code Playgroud)

我试过的代码:

gsub("(.{5}).*", "X", a)
Run Code Online (Sandbox Code Playgroud)

regex r gsub regex-group data-masking

6
推荐指数
1
解决办法
202
查看次数

正则表达式用于匹配仅由字母列表构成的单词

给定一组单词,我需要知道哪些单词仅由一组字母组成。即使此字母是验证集的一部分,该单词的字母也不能超过允许的数量。

例:

Char set: a, a, ã, c, e, l, m, m, m, o, o, o, o, t (fixed set)

Words set: mom, ace, to, toooo, ten, all, aaa (variable set)
Run Code Online (Sandbox Code Playgroud)

结果:

mom = true
ace = true
to = true
toooo = true
ten = false (n is not in the set)
all = false (there is only 1 L in the set)
aaa = false (theres is only 2 A in the set)
Run Code Online (Sandbox Code Playgroud)

如何在Javascript中生成此正则表达式?(区分大小写不是问题)。

我尝试了以下代码,但未成功:

var str = …
Run Code Online (Sandbox Code Playgroud)

javascript regex regex-group regex-greedy regex-lookarounds

5
推荐指数
1
解决办法
113
查看次数

匹配日期的正则表达式(月日、年或 m/d/yy)

我正在尝试编写一个正则表达式,该表达式可用于在字符串中查找日期,该字符串前面(或后面)可能有空格、数字、文本、行尾等。该表达式应处理美国日期格式要么

1) Month Name Day, Year - 即 2019 年 1 月 10 日或
2) mm/dd/yy - 即 11/30/19

我为月份名称,年份找到了这个

(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+\d{1,2},\s+\d{4}
Run Code Online (Sandbox Code Playgroud)

(感谢 Veverke 在这里Regex 匹配日期,如月份名称日逗号和年份

这对于 mm/dd/yy(以及 m/d/y 的各种组合)

(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])/(?:[0-9]{2})?[0-9]{2} 
Run Code Online (Sandbox Code Playgroud)

(在此感谢 Steven Levithan 和 Jan Goyvaerts https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s04.html

我试图把它们像这样结合起来

((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+\d{1,2},\s+\d{4})|((1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])/(?:[0-9]{2})?[0-9]{2})
Run Code Online (Sandbox Code Playgroud)

当我在输入字符串“Paid on 1/1/2019”中搜索“on [regex above]”时,它确实找到了日期,但没有找到“on”这个词。如果我只是使用,则找到该字符串

(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])/(?:[0-9]{2})?[0-9]{2}
Run Code Online (Sandbox Code Playgroud)

谁能看到我做错了什么?

编辑

我正在使用下面的 c# .net 代码:

    string stringToSearch = "Paid on 1/1/2019";
    string searchPattern = @"on ((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+\d{1,2},\s+\d{4})|((1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])/(?:[0-9]{2})?[0-9]{2})";
    var match = Regex.Match(stringToSearch, searchPattern, RegexOptions.IgnoreCase);


    string foundString;
    if (match.Success)
        foundString= stringToSearch.Substring(match.Index, match.Length);
Run Code Online (Sandbox Code Playgroud)

例如

string searchPattern = …
Run Code Online (Sandbox Code Playgroud)

c# regex regex-group regex-greedy regex-lookarounds

5
推荐指数
1
解决办法
5608
查看次数

Elixir 中的 RegEx 捕获组

我想知道这个 Elixir 正则表达式是如何工作的。

 Regex.run(~r{(*UTF)([^\w])+}, "dd!!%%%")
Run Code Online (Sandbox Code Playgroud)

当我执行这个正则表达式时,输出是

["!!%%%", "%"]
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么在匹配正则表达式后会重复最后一个 %。

regex elixir regex-group

5
推荐指数
0
解决办法
538
查看次数