RegEx получает последнее значение из строки под соответствием - PullRequest
0 голосов
/ 27 января 2020

Мне нужно найти способ получить последнее значение из строки, если не найдено соответствующее значение:

RegEx Я пытался:

\b22001.*\s(\d.*[\d,]*)

Пример текста:

   22001      kerbs A4, 12/15/25cm, G341, R0.50, in plywood packages
              red mark - Jujia              9,36 m           Yuan    119,12 Yuan   1.114,96  68010000
   22014      kerbs A4, 12/15/25cm, G341, R12.00, in plywood packages
              red mark - Jujia             12,14 m           Yuan    119,12 Yuan   1.446,12  68010000
              order No. 1800883
  1001559     middlepieces to kerbs A4/A5, 20cm high, R6.00,
              frontedge rounded R=2 cm, in plywood packages
              red mark - Jujia             50,27 m           Yuan     99,12 Yuan   4.982,76  68010000

в этом примере мне нужны "1.114,96" и "68010000"

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вы можете сопоставить эти значения, используя

(?m)\b1001559\b.*(?:\n(?![\p{Zs}\t]*\d+[\p{Zs}\t])[\p{Zs}\t]{3,}.*?(?: (\d[\d.,]*) +(\d[\d,]*))?\r?$)+

См. Демонстрационную версию regex :

enter image description here

Подробности

  • (?m) - Многострочный режим на
  • \b - граница слова
  • 1001559 - число
  • \b - граница слова
  • .* - остаток строки
  • (?: - начало группы без захвата # 1:
    • \n(?![\p{Zs}\t]*\d+[\p{Zs}\t]) - новая строка без 0+ горизонтальных пробелов, 1+ цифр и горизонтальных пробелов
    • [\p{Zs}\t]{3,} - три или более горизонтальных пробела
    • .*? - 0 или больше символов, кроме новой строки, как можно меньше
    • (?: - начало группы без захвата # 2:
      • - пробел
      • (\d[\d.,]*) - группа 1: ди git, за которым следуют 0 или более цифр, . или , символов
      • + - 1+ пробелов
      • (\d[\d,]*) - группа 2: ди git, за которым следуют 0 или более цифр, . или , символов
    • )? - конец группа № 2, соответствует 1 или 0 раз
    • \r?$ - дополнительный CR и привязка конца строки
  • )+ - конец группы без захвата # 1.

См. VB. NET демо онлайн :

Imports System
Imports System.Text.RegularExpressions

Public Class Test
    Public Shared Sub Main() 
        Dim strArtikel As String = "1001559"
        Dim pattern As String = "(?m)\b" & strArtikel & "\b.*(?:\n(?![\p{Zs}\t]*\d+[\p{Zs}\t])[\p{Zs}\t]{3,}.*?(?: (\d[\d.,]*) +(\d[\d,]*))?\r?$)+"
        Dim s As String = "   22001      kerbs A4, 12/15/25cm, G341, R0.50, in plywood packages" & vbCrLf & "              red mark - Jujia              9,36 m           Yuan    119,12 Yuan   1.114,96  68010000" & vbCrLf & "   22014      kerbs A4, 12/15/25cm, G341, R12.00, in plywood packages" & vbCrLf & "              red mark - Jujia             12,14 m           Yuan    119,12 Yuan   1.446,12  68010000" & vbCrLf & "              order No. 1800883" & vbCrLf & "  1001559     middlepieces to kerbs A4/A5, 20cm high, R6.00," & vbCrLf & "              frontedge rounded R=2 cm, in plywood packages" & vbCrLf & "              red mark - Jujia             50,27 m           Yuan     99,12 Yuan   4.982,76  68010000"
        Dim matches As MatchCollection = System.Text.RegularExpressions.Regex.Matches(s, pattern)
        For Each m As Match In matches
            Console.WriteLine("Matches for '" & strArtikel & "'....")
            Console.WriteLine(m.Groups(1).Value)
            Console.WriteLine(m.Groups(2).Value)
        Next

    End Sub
End Class

Выход:

Matches for '1001559'....
4.982,76
68010000
0 голосов
/ 27 января 2020
(\b(\d[\d,.]+)\s+(\d[\d.,]+)$)

Демо: Regex101

Тогда вы получите 2 группы захвата.

[0] даст вам 1,114,96

[1] даст вам 68010000

Что здесь происходит?

\b граница группы захвата ()

\d соответствует числу [\d,.] экранирует . и ,

$ соответствует концу строки

Чтобы это работало, необходимо включить многострочный флаг.

ОБНОВЛЕНИЕ

Если вы хотите найти определенную c запись замену 22014:

^\n?\r?\s*22014?.*\w*\s+\w.* (\d[\d,.]+)\s+(\d[\d,.]+)$

Демонстрация: Regex101

...