Регулярное выражение с условием If Else

#go #regex-group

#Вперед #регулярное выражение-группа

Вопрос:

У меня проблема с условием If Else в регулярном выражении. У меня есть файл, который содержит следующий формат. Я искал возвращаемое значение, равное либо 0.0.985, либо 3.3.5-3811. Я пытался использовать условие if else в регулярном выражении, но не смог этого сделать, может кто-нибудь объяснить мне, как решить проблему, пожалуйста.

 random-app-0.0.985.tgz
busy-app-7.3.1.2-3.3.5-3811-a19874elkc-123254376584.zip
  

Ниже приведен код Go, который я пытаюсь использовать

 package main

import (
    "fmt"
    "io/ioutil"
    "regexp"
)

func main(){
    content, err:= ioutil.ReadFile("version.txt")
    if err != nil{
        fmt.Println(err)
    }
    version:= string(content)
    re:= regexp.MustCompile(`(d ).(d ).(d )|(d ).(d ).(d ).(d )`)
    result:= re.FindAllStringSubmatch(version,-1)
    for i:= range(result){
        fmt.Println(result[i][0])
    }
}
  

Вывод выполняется следующим образом

 0.0.985
7.3.1
2-3.3
5-3811
19874
123254376584
  

Ответ №1:

Может использоваться следующее регулярное выражение: [d.] [.-][d]{2,}

 package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`(?m)[d.] [.-][d]{2,}`)
    var str = `random-app-0.0.985.tgz
busy-app-7.3.1.2-3.3.5-3811-a19874elkc-123254376584.zip`
    
    for i, match := range re.FindAllString(str, -1) {
        fmt.Println(match, "found at index", i)
    }
}
  

Вывод

 0.0.985 found at index 0
3.3.5-3811 found at index 1
  

игровая площадка

?m многострочный модификатор. Заставляет ^ и $ совпадать с началом / концом каждой строки (а не только с началом / концом строки). В этом случае это не имеет большого значения. Он будет работать без него.

[d.] соответствует по крайней мере один раз (квантификатор ) последовательности цифр или точек

[.-] соответствует точке или дефису

[d]{2,} соответствует как минимум двум цифрам (квантификатор {2,} )

Комментарии:

1. Привет, привет, мне понравилось ваше решение, но, честно говоря, поскольку я новичок, я не понимаю фактического значения синтаксиса. Здесь нужна небольшая помощь. Все, что я понял, это ?m => Сопоставить все символы, включая символы разрыва, как это происходит?m[d.] соответствует всем x.x.x. И квантификатору [d]{2,}, что здесь обозначается как 2..

2. Я добавил несколько комментариев к регулярному выражению

Ответ №2:

Одна из проблем вашего кода заключается в том, что в регулярном выражении . соответствует любому символу, но вы хотите, чтобы он соответствовал буквенной точке. . [.] Вместо этого используйте или.