Mam podążanie za ciągami, gdzie muszę znać pozycję danych według określonych znaków.

ISAIAH KINNEY 06/2021 1 11111

Darius KNOX 10/2020 1 11-334-555

Leo Wiley 07/2020 1 22-333

Kamienne ściany 11/2020 2 112333

John Stone 12/2021 x xx-xx-xxx

Muszę wiedzieć, na jakich pozycjach są liczbą oznaczoną jako pogrubioną, kiedy nie mam numerów zamiast im, mam x znaki.

Próbowałem z tym "(d + (d + | - *) d +) (| $)", ale z tym mam białe znaki przed pogrubioną liczbą.

-1
user9681594 26 lipiec 2020, 23:31

1 odpowiedź

Najlepsza odpowiedź

Posługiwać się

(?<!\S)(?:x+(?:-x+)*|\d+(?:-\d+)*)$

Zobacz Dowód

WYJAŚNIENIE

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?<!                     look behind to see if there is not:
--------------------------------------------------------------------------------
    \S                       non-whitespace (all but \n, \r, \t, \f,
                             and " ")
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  (?:                      group, but do not capture:
--------------------------------------------------------------------------------
    x+                       'x' (1 or more times (matching the most
                             amount possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (0 or more
                             times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      -                        '-'
--------------------------------------------------------------------------------
      x+                       'x' (1 or more times (matching the
                               most amount possible))
--------------------------------------------------------------------------------
    )*                       end of grouping
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (0 or more
                             times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      -                        '-'
--------------------------------------------------------------------------------
      \d+                      digits (0-9) (1 or more times
                               (matching the most amount possible))
--------------------------------------------------------------------------------
    )*                       end of grouping
--------------------------------------------------------------------------------
  )                        end of grouping
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

Kod wygenerowany przez REGEX101 wydaje się przynieść oczekiwane szczegóły:

using System;
using System.Text.RegularExpressions;
 
public class Example
{
    public static void Main()
    {
        string pattern = @"(?<!\S)(?:x+(?:-x+)*|\d+(?:-\d+)*)$";
        string input = @"Isaiah Kinney 06/2021 111111
Darius Knox 10/2020 111-334-555
Leo Wiley 07/2020 122-333
Stone Walls 11/2020 2112333
John Stone 12/2021 xxx-xx-xxx";
        RegexOptions options = RegexOptions.Multiline;
 
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

Wynik:

'111111' found at index 22.
'111-334-555' found at index 49.
'122-333' found at index 79.
'2112333' found at index 107.
'xxx-xx-xxx' found at index 134.
4
Ryszard Czech 26 lipiec 2020, 21:07