Если число всегда начинается с + и вы хотите получить полный номер без него, используйте:
\+(\d+(?:\s\d+)*)\b
и оно вернется (из вашего примера): 12 555 660 000
См. Онлайн: https://regex101.com/r/aEeIgK/2
Объяснение:
\+
начать с определения + перед началом нашего матча. Экранирование как + - это квантор регулярного выражения. \b
оканчиваются границей слова (поэтому, если смешанная строка начинается с цифр, она не будет частью совпадения). (\d+(?:\s\d+)*)
с круглыми скобками (...)
- это то, что будет совпадать. \d+
одна или несколько цифр в начале - это мачта. \d
является цифрой; +
квантификатор для одного или нескольких. (?:\s\d+)*
необязательные (ноль или более) строки, начинающиеся с пробела \s
, за которыми следуют цифры. (?:...)
- это несоответствие скобок. *
квантификатор для нуля или более. \s
пробел (только один). Вы можете настроить его следующим образом:
_mockRepos.Setup(x => x.Single<Page>(It.IsAny<Expression<Func<Page, bool>>>()))//.Returns etc...;
Однако вы сталкиваетесь с одним из недостатков Moq. Вы бы хотели поместить туда действительное выражение вместо использования It.IsAny
, но Moq не поддерживает установку методов, которые принимают выражения с конкретными выражениями (это трудно реализуемая возможность). Сложность возникает из-за необходимости выяснить, эквивалентны ли два выражения.
Поэтому в вашем тесте вы можете передать any Expression
и он передаст обратно все, что вы настроили mock на возврат. Значение теста немного размыто.
Пусть вызов .Returns возвращает результат выражения для вашей переменной allPages.
_mockRepos.Setup(x => x.Single<Page>(It.IsAny<Expression<Func<Page, bool>>>()))
.Returns( (Expression<Func<Page, bool>> predicate) => allPages.Where(predicate) );
Использование It.IsAny<>
Moq без .CallBack
вынуждает вас писать код, который не охватывается вашим тестом. Вместо этого он позволяет любому запросу / выражению вообще проходить, делая ваш макет практически бесполезным с точки зрения модульного тестирования.
Решение: вам нужно либо использовать Обратный вызов для проверки выражения, либо вам нужно лучше ограничить свой макет. В любом случае это грязно и сложно. Я занимался этим вопросом до тех пор, пока я практикую TDD. Я наконец собрал вспомогательный класс, чтобы сделать его более выразительным и менее запутанным. Вот пример одного возможного конечного результата:
mockPeopleRepository
.Setup(x => x.Find(ThatHas.AnExpressionFor<Person>()
.ThatMatches(correctPerson)
.And().ThatDoesNotMatch(deletedPerson)
.Build()))
.Returns(_expectedListOfPeople);
Вот статья в блоге, в которой говорится об этом и дается исходный код: http://awkwardcoder.com/2013/04/24/ сдерживающими-издевается-с-выражение-аргументы /