Два трюка . В основном, инвертирование 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>
Небольшое улучшение решения @ 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
.
Если у вас есть Linq:
stringArray.Select(s=>decimal.Parse(s));
Также будет работать foreach
. Вам может потребоваться проверить, что каждый string
на самом деле является числом (.Parse
не выбрасывает исключение).
Проверьте синтаксические лексеры для большинства языков программирования для регулярного выражения для десятичных знаков. Сопоставьте это регулярное выражение с строкой, найдя все совпадения.
try
Regex.Split (sentence, @"[^0-9\.]+")
В вашем регулярном выражении вам нужно будет указывать десятичные разряды. Попробуйте следующее:
\d+(\.\d+)?
Это будет соответствовать номерам, а не всем, кроме чисел, но должно быть простым для итерации по совпадениям для создания вашего массива.
Что-то иметь в виду, следует ли вам также искать отрицательные знаки, запятые и т. д.
Кредит для последующих идет на @ 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
, исключить или не извлекать число, которое заканчивается десятичным разделителем.
Общее регулярное выражение для соответствия наиболее распространенным типам десятичных чисел приведено в Согласование чисел с плавающей запятой с регулярным выражением :
[-+]?[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();
1,000,000.20
, но, конечно, не для 1.000.000,20
, поскольку они не должны использоваться в одном и том же контексте, поскольку второй не соответствует формату номера в США. Вам необходимо вручную изменить выражение для использования периодов в виде символа группировки цифр и запятых в качестве разделителя на десятичные числа.
– Wiktor Stribiżew
29 January 2018 в 11:48
\d[\d.,]*(?:[eE][-+]?\d+)?
. При необходимости соедините границы слов.
– Wiktor Stribiżew
29 January 2018 в 12:09