2013-06-30 3 views
0

У меня проблемы с регулярным выражением. У меня есть линия Свернуть | Скопировать кодстрока Regex, которая находит цифры

Контракт Nr.123456, reg.Nr.654321-118

Я хочу использовать регулярное выражение, которое находит только строку 123456, но не находит второй 6 digit- 3 (654321-118)

Это то, что я придумал, но на самом деле не знаю, что делать дальше Свернуть | Код Кода

string regex4 = @"\d{4,6}[^-]"; 

Любые идеи? Спасибо.

--- запятая не специфична, я думаю, что нужно построить регулярное выражение, так он не нашел строки, которые заканчиваются с «-» знаком

--- Это деталь платежа в банк, информация для полевых работ. Есть два возможных набора цифр xxxxxx и xxxxxx-xxx, мне нужно найти только первый.

+0

Ваше регулярное выражение правильно ... –

+5

Если всегда есть две такие группы, и вы хотите только найти первую группу, а затем просто не искать вторую после ... 'Regex.Match()' найдет ** первое ** появление шаблона в строке, вы тогда (не используйте) 'Match.NextMatch()', чтобы получить следующее появление. – millimoose

+0

В противном случае вы можете использовать отрицательный результат: '\ d {4,6} (?! -)'. (Ваше исходное регулярное выражение не сработает, если 4-6 цифр будут в конце строки, так как для этого требуется один символ, который не является '-'.) – millimoose

ответ

0

Немного сырой, но если это чистые номера только вы обеспокоены и только первый из его вхождения, то вы можете сделать что-то простое, как,

const string stuff = "Contract Nr.123456,reg.Nr.654321-118"; 

var regex = new Regex(@"\d+"); 

Console.WriteLine(regex.Match(stuff).Value); 
0

Есть много способов, вы можете сделать это. Например, вы можете сопоставлять как \ d +, так и \ d + - \ d + и THEN выбирать только \ d + единицы. Хотя, мне нравится смотреть вперед и смотреть-за подход (примечание: я представил разрывы строк и комментарии для удобства чтения, они должны быть для удаления)

(?<!\d+-\d*) -- there is NO number in front 
\d+   -- I AM THE number 
(?!\d*-\d+) -- there is NO number behind 

так, ваше регулярное выражение выглядит следующим образом:

const string stuff = "Contract Nr.123456,reg.Nr.654321-118"; 
var rx = new Regex(@"(?<!\d+-\d*)\d+(?!\d*-\d+)"); 
Console.WriteLine(rx.Match(stuff).Value); 
// result: 123456 

или, если вы хотите, чтобы все без дефис чисел в строке:

const string stuff = "Contract Nr.123456,reg.Nr.654321-118 and 435345"; 
var rx = new Regex(@"(?<!\d+-\d*)\d+(?!\d*-\d+)"); 
var m = rx.Match(stuff); 
while (m.Success) 
{ 
    Console.WriteLine(m.Value); 
    m = m.NextMatch(); 
} 
// result: 123456 and 435345 

ПРИМЕЧАНИЕ: и в следующий раз постараюсь быть более конкретным, потому что, честно говоря, ответ на го Вопрос, который вы задали, - «регулярное выражение, которое соответствует« 123456 », равно ...« 123456 ».

ПРИМЕЧАНИЕ: Я проверил его с LinqPad.

Смежные вопросы