RegEx необходимо совместить число до двух знаков после запятой, необязательные $ и запятые [дубликаты]

Два трюка . В основном, инвертирование HTML-кода ваших желаемых элементов в HTML и использование ~ Операторы следующего сиблинга :

float-right + инвертируют порядок HTML элементы

div{ /* Do with the parent whatever you know just to make the
  inner float-right elements appear where desired */
  display:inline-block;
}
span{
  float:right;  /* float-right the elements! */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
  background:red;
} 
<div>
  <!-- Reverse the order of inner elements -->
  <span>5</span>
  <span>4</span>
  <span>3</span>
  <span>2</span>
  <span>1</span>
</div>


Родитель с direction: rtl; + инвертирует порядок внутренних элементов

.inverse{
  direction: rtl;
  display: inline-block; /* inline-block to keep parent at the left of window */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
  background:gold;
}
Hover one span and see the previous elements being targeted!<br>

<div class="inverse">
  <!-- Reverse the order of inner elements -->
  <span>5</span>
  <span>4</span>
  <span>3</span>
  <span>2</span>
  <span>1</span>
</div>

9
задан Russ 26 August 2010 в 14:12
поделиться

7 ответов

Небольшое улучшение решения @ Michael:

// NOTES: about the LINQ:
// .Where() == filters the IEnumerable (which the array is)
//     (c=>...) is the lambda for dealing with each element of the array
//     where c is an array element.
// .Trim()  == trims all blank spaces at the start and end of the string
var doubleArray = Regex.Split(sentence, @"[^0-9\.]+")
    .Where(c => c != "." && c.Trim() != "");

Возвраты:

10.4
20.5
40
1

Исходное решение возвращалось

[empty line here]
10.4
20.5
40
1
.
25
ответ дан code4life 19 August 2018 в 13:21
поделиться

Если у вас есть Linq:

stringArray.Select(s=>decimal.Parse(s));

Также будет работать foreach. Вам может потребоваться проверить, что каждый string на самом деле является числом (.Parse не выбрасывает исключение).

0
ответ дан cofiem 19 August 2018 в 13:21
поделиться
  • 1
    как получить значение s – ratty 26 August 2010 в 14:22
  • 2
    s - это переменная in-scope для запроса Linq. Это похоже на выражение foreach (строка s в stringArray). – Ryan Bennett 26 August 2010 в 16:05

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

1
ответ дан Daren Thomas 19 August 2018 в 13:21
поделиться

try

Regex.Split (sentence, @"[^0-9\.]+")
5
ответ дан Michael Pakhantsov 19 August 2018 в 13:21
поделиться
  • 1
    Это также даст вам ложное положительное значение на 10.1.1.4. – Joel Etherton 26 August 2010 в 14:14
  • 2
    Разве карет (^) не отрицает это? – Daren Thomas 26 August 2010 в 14:16
  • 3
    @ Daren Thomas, \ D equal [^ 0-9] – Michael Pakhantsov 26 August 2010 в 14:34
  • 4
    @Joel Etherton, да, он будет соответствовать также строкой типа «10 .1.1.4» и даже одной точкой. – Michael Pakhantsov 26 August 2010 в 14:35
  • 5
    @ Daren Thomas, вы раскалываете предложение в серии нечисловых символов, оставляя только цифры. – strager 27 August 2010 в 14:28

В вашем регулярном выражении вам нужно будет указывать десятичные разряды. Попробуйте следующее:

\d+(\.\d+)?

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

Что-то иметь в виду, следует ли вам также искать отрицательные знаки, запятые и т. д.

0
ответ дан Ryan Brunner 19 August 2018 в 13:21
поделиться

Кредит для последующих идет на @ code4life. Все, что я добавил, это цикл for для синтаксического анализа целых чисел / десятичных знаков перед возвратом.

    public string[] ExtractNumbersFromString(string input)
    {
        input = input.Replace(",", string.Empty);

        var numbers =  Regex.Split(input, @"[^0-9\.]+").Where(c => !String.IsNullOrEmpty(c) && c != ".").ToArray();

        for (int i = 0; i < numbers.Length; i++)
            numbers[i] = decimal.Parse(numbers[i]).ToString();

        return numbers;
    }
0
ответ дан Sagar 19 August 2018 в 13:21
поделиться

Повторное выражение для извлечения числа десятичных чисел / чисел с плавающей точкой может быть различным в зависимости от того, используются ли какие-либо разделители тысяч, какой символ обозначает десятичный разделитель, нужно ли также соответствовать экспоненте, соответствовать ли положительному или отрицательному знаку, независимо от того, соответствуют ли номера, которые могут иметь ведущие 0, исключить или не извлекать число, которое заканчивается десятичным разделителем.

Общее регулярное выражение для соответствия наиболее распространенным типам десятичных чисел приведено в Согласование чисел с плавающей запятой с регулярным выражением :

[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?

Я только изменил группу захвата на не захватывающий (добавлено ?: после (). Он соответствует

Если вам нужно сделать его еще более общим, если десятичный разделитель может быть точкой или запятой, замените \. с символьным классом (или выражением скобки) [.,]:

[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
           ^^^^

Обратите внимание, что выражения выше соответствуют как целым, так и поплавкам . Чтобы сопоставить только числа с плавающей запятой / десятичные числа, убедитесь, что часть дробного шаблона является обязательной, удалив вторую ? после \. ( demo ):

[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
            ^

Теперь 34 не сопоставляется: сопоставляется.

Если вы не хотите сопоставлять числа с плавающей запятой без начальных нулей (например, .5), то сделать первый знак соответствия шаблону обязательным (по добавление квантора +, чтобы соответствовать 1 или более вхождений цифр):

[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
          ^

См. эту демонстрацию . Теперь оно соответствует значительно меньшему количеству образцов:

Теперь, если вы не хотите сопоставлять <digits>.<digits> внутри <digits>.<digits>.<digits>.<digits>? Как сопоставить их как целые слова? Используйте lookarounds :

[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)

И демо-версия здесь :

Теперь, как насчет тех плавающих с тысячами разделителей, как 12 123 456.23 или 34,345,767.678? Вы можете добавить (?:[,\s][0-9]+)* после первого [0-9]+, чтобы соответствовать нулевым или более последовательностям запятой или пробелам, за которыми следуют 1 + цифры:

[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])

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

Поменяйте запятую на \., если вам нужно использовать запятую как разделитель десятичной дроби и период как разделитель тысяч.

Теперь, как использовать эти шаблоны в C #?

var results = Regex.Matches(input, @"<PATTERN_HERE>")
        .Cast<Match>()
        .Select(m => m.Value)
        .ToList();
4
ответ дан Wiktor Stribiżew 19 August 2018 в 13:21
поделиться
  • 1
    Спасибо за ваш ответ. Это не будет работать для строк типа «1,000,000.20». или "1.000.000,20". – joanfihu 29 January 2018 в 11:43
  • 2
    @joanfihu Это работает для 1,000,000.20, но, конечно, не для 1.000.000,20 , поскольку они не должны использоваться в одном и том же контексте, поскольку второй не соответствует формату номера в США. Вам необходимо вручную изменить выражение для использования периодов в виде символа группировки цифр и запятых в качестве разделителя на десятичные числа. – Wiktor Stribiżew 29 January 2018 в 11:48
  • 3
  • 4
    @joanfihu Попробуйте все это сделать - см. эту демонстрацию . Обратите внимание, что если вам не нужно сопоставлять числа с близкой последовательностью, то есть, если ваши тексты чисты, а числа не следуют друг за другом (после запятой или точкой), это может быть намного проще, скажем, что-то вроде \d[\d.,]*(?:[eE][-+]?\d+)? . При необходимости соедините границы слов. – Wiktor Stribiżew 29 January 2018 в 12:09
Другие вопросы по тегам:

Похожие вопросы: