2015-07-25 2 views
-2

Мне нужно найти целое число в строке, которая содержит одно целое число и одно процентное число.Найти целые числа в строке, кроме чисел, включая% C#

Пример: цена 3500 USD и скидка 34% Мне нужно извлечь только 3500.

В настоящее время я использую:

Regex.Match("price 3500 USD and discount 34%" , @"\d+"); 

Но оно не извлечь 3500 только.

+3

Просьба представить ваши попытки для решения этой проблемы и показать более подробные данные. – hwnd

+0

Можете ли вы дать дополнительную информацию о строковой структуре строк, и если это за строку и т. Д.? Вам просто нужны номера, а также «USD» и т. Д.? Если вам просто нужны номера, которые вы могли бы просто разделить по пространству и извлечь все числа, которые не являются десятичными. – Bauss

+0

@Bauss Существует не какая-либо известная структура для строки, просто она содержит одну цифру и одно десятичное число, и мне просто нужно целое число. – Kamran

ответ

1

Поскольку вы сказали, что все номера разделены пространством, вы можете просто сделать это так.

public static List<int> GetNumbers(string str) 
{ 
    List<int> numbers = new List<int>(); 
    foreach (data; str.Split(' ')) 
    { 
     int value; 
     if (int.TryParse(data, out value)) 
      numbers.Add(value); 
    } 
    return numbers; 
} 

Если переданная строка (str) - это строка, в которой есть цифры.

Кроме того, если вы хотите получить десятичные вы можете использовать double.TryParse()

1

Я думаю, одно решение будет искать подстроки, где нет ни слова характера.

Таким образом, регулярное выражение будет ^\w+. Посмотрите на http://www.regexr.com/3bfdc.

РЕДАКТИРОВАТЬ: Ответ неправильный, поскольку он сводит только начало без слов. Я думаю, что правильное решение - использовать \w\d+\w, который действительно соответствует всем единственным цифровым подстрокам. См. Его правильную работу here.

Ответы были не правильными, но я думаю, что я получил смысл подстроки (которые имеют ограничители пространства), где нет символа слова. Были даны лучшие решения, такие как элегантный для C#, а другой - с регулярным выражением, которое использует ограничения и обрамление и lookbehind.

2

Пробельные границы являются ключевыми здесь. Этот тип конструкции утверждения
соответствует также BOS и EOS.

Вы можете найти целые числа на пробельных границах, как это -

# @"(?<!\S)\d+(?!\S)" 

(?<! \S)    # Whitespace boundary 
\d+ 
(?! \S)    # Whitespace boundary 

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

# @"(?<!\S)(?:\d+(?:\.\d*)?|\.\d+)(?!\S)" 

(?<! \S)    # Whitespace boundary 
(?:     # Integer or decimal number 
     \d+ 
     (?: \. \d*)? 
    | \. \d+ 
) 
(?! \S)    # Whitespace boundary 
4

Вам не нужно регулярное выражение для этого , Простой Linq достаточно

var numbers = inputstr.Split().Where(x => x.All(char.IsDigit)).ToArray(); 
+0

Элегантное решение C#. – fsacer

+0

Для того, что это стоит, справедливость этого ответа зависит от интерпретации критерия «найти целое число в строке, которая включает одно целое и одно процентное число» - в том, что желаемое поведение не определено, когда процентное число не присутствует. То есть, означает ли OP термин «который может включать» или «который должен включать»? Это было сказано, я согласен, это очень элегантное решение. :-) – DreadPirateShawn

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