提取<*n(其中n是一个数字)的正则表达式

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

Regex to extract <*n (where n is a number)

问题

我有一个字符串的形式

"abcd&lt;*15&lt;&lt;defgj&lt;*3fsdfsdf"

我想提取所有的&lt;或者&lt;*后面跟着一个数字,比如&lt;*15&lt;*8&lt;*1等等。

我有这个正则表达式:

&lt;\*?[0-9+]?

在示例字符串中匹配到了:

&lt;*1
&lt;
&lt;
&lt;*3

但我希望它能匹配到第一个作为&lt;*15

我以为正则表达式中的+可以实现这个功能,所以我不确定为什么它不起作用。

我还尝试了

&lt;\*?[\d+]?

但仍然只能匹配到&lt;*后面最多一个数字。

一个&lt;要么是独立的,要么后面跟着一个*和一个数字。我想把&lt;6捕获为&lt;

如果&lt;后面跟着一个*,但没有数字,比如&lt;*abc,我只想捕获&lt;

英文:

I have a string of the form

&quot;abcd&lt;*15&lt;&lt;defgj&lt;*3fsdfsdf&quot;

I want to pull out all the &lt; or &lt;* followed by a number, e.g. &lt;*15, &lt;*8, &lt;*1 etc

I have this:

&lt;\*?[0-9+]?

Which in the example strings matches

&lt;*1
&lt;
&lt;
&lt;*3

But I'd like it to match the first one as <*15

I thought the + did this in the regex, so I'm not sure why it's not working.

I also tried

&lt;\*?[\d+]?

But still I get at most one digit following &lt;*

A &lt; will always either be on it's own, or followed by a * followed by a number. I want to capture &lt;6 as just &lt;

If the &lt; is followed by a *, but then no number. e.g. &lt;*abc I would just want to capture &lt;

答案1

得分: 2

你需要

&lt;(?:\*\d+)?

请参见正则表达式演示

详细信息

  • &lt; - 一个 &lt; 字符
  • (?:\*\d+)? - 一个可选的非捕获组,匹配一个或零个 * 字符,后面跟着一个或多个数字。

请参见Go演示

package main

import (
	"fmt"
	"regexp"
)

func main() {
	r := regexp.MustCompile(`&lt;(?:\*\d+)?`)
	matches := r.FindAllStringSubmatch("&lt;*1 &lt; &lt;6", -1)
	for _, v := range matches {
		fmt.Println(v[0])
	}
}

输出

&lt;*1
&lt;
&lt;
英文:

You need

&lt;(?:\*\d+)?

See the regex demo.

Details:

  • &lt; - a &lt; char
  • (?:\*\d+)? - an optional non-capturing group matching one or zero repetition of a * char and one or more digits after it.

See the Go demo:

package main

import (
	&quot;fmt&quot;
	&quot;regexp&quot;
)

func main() {
	r := regexp.MustCompile(`&lt;(?:\*\d+)?`)
	matches := r.FindAllStringSubmatch(&quot;&lt;*1 &lt; &lt;6&quot;, -1)
	for _, v := range matches {
		fmt.Println(v[0])
	}
}

Output

&lt;*1
&lt;
&lt;

答案2

得分: 1

我会使用\&lt;\*{1}\d+|\&lt;

解释:

  1. \&lt; 匹配小于号字符
  2. \*{1} 后面跟着一个星号
  3. \d+ 后面跟着任意数量的连续数字
  4. |\&lt; 或者只匹配一个&lt;,如果前面的条件不匹配
import (
	"fmt"
	"regexp"
)

func main() {
	pattern := regexp.MustCompile(`\&lt;\*{1}\d+|\&lt;`)

	inputString_1 := "abc&lt;*15&lt;&lt;def&lt;*3ghi"
	inputString_2 := "jkl&lt;42&lt;&lt;mno&lt;7pqrst"

	fmt.Println(pattern.FindAllString(inputString_1, -1))
	fmt.Println(pattern.FindAllString(inputString_2, -1))
}

// 输出:
// [&lt;*15 &lt; &lt; &lt;*3]
// [&lt; &lt; &lt; &lt;]

Playground: https://go.dev/play/p/xNmsrilYGRL

正则表达式: https://regex101.com/r/6TtLtl/1

关于你的备注...

> 我以为在正则表达式&lt;\*?[0-9+]?中,+会起作用,所以我不确定为什么它不起作用。

[0-9+]? 贪婪地匹配任何数字 一个加号 一个空字符串。

参考: https://www.rexegg.com/regex-quantifiers.html

英文:

I would use \&lt;\*{1}\d+|\&lt;

explanation:

  1. \&lt; Match the lesser than char
  2. \*{1} Followed by an asterix
  3. \d+ Followed by any number of sequential digits
  4. |\&lt; Or just match a &lt; if the above does not match
import (
	&quot;fmt&quot;
	&quot;regexp&quot;
)

func main() {
	pattern := regexp.MustCompile(`\&lt;\*{1}\d+|\&lt;`)

	inputString_1 := &quot;abc&lt;*15&lt;&lt;def&lt;*3ghi&quot;
	inputString_2 := &quot;jkl&lt;42&lt;&lt;mno&lt;7pqrst&quot;

	fmt.Println(pattern.FindAllString(inputString_1, -1))
	fmt.Println(pattern.FindAllString(inputString_2, -1))
}

// Output:
// [&lt;*15 &lt; &lt; &lt;*3]
// [&lt; &lt; &lt; &lt;]

Playground: https://go.dev/play/p/xNmsrilYGRL

Regex: https://regex101.com/r/6TtLtl/1

Regarding your note...

> I thought the + did this in the regex &lt;\*?[0-9+]? so I'm not sure why it's not
> working.

[0-9+]? greedily matches any digit or a "+" or an empty string.

see: https://www.rexegg.com/regex-quantifiers.html

huangapple
  • 本文由 发表于 2023年5月11日 21:52:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/76228402.html
匿名

发表评论

匿名网友

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

确定