Я пытаюсь написать правило проверки, которое будет разрешать только числа, десятичные числа и символ %.

Ниже приведены образцы, которые я пытаюсь использовать, но они не работают. Если поставить 17,5% не работает

  • Любое число до 100 (0-100)
  • Число с символом % = от 0% до 100%
  • Десятичный = от 0,00% до 100,00%

!REGEX(Text_Field__c , "[0-9]+(.[0-9])+[%]")

2
learningmode 2 Июл 2019 в 16:01
Не могли бы вы отредактировать свой вопрос, чтобы дать более подробную информацию о том, что не работает? Какие входные данные аннулируются, но должны быть действительными, и наоборот?
 – 
Thomas Taylor
2 Июл 2019 в 15:50
Обновил вопрос
 – 
learningmode
2 Июл 2019 в 16:05

3 ответа

В вашем регулярном выражении вы ищете одну или несколько цифр (любое их количество), за которыми следует один или несколько экземпляров любого одиночного символа (точка) и цифра, за которой следует обязательный знак процента. 17.5% должно пройти - я не уверен, почему это не так. Но так бы и 67534&8(9h6%. Я думаю, вам следует отделить часть максимального значения от части регулярного выражения. Попробуй это:

!REGEX(Text_Field__c, "[0-9]{1,3}(\\.[0-9]{1,2})?%?") || 
    IF(RIGHT(Text_Field__c,1) = "%", 
        VALUE(LEFT(Text_Field__c,LEN(Text_Field__c)-1)) > 100, 
        VALUE(Text_Field__c) > 100)

В регулярном выражении указано искать не менее 1, но не более 3 цифр: [0-9]{1,3}. Затем группа символов, состоящая из точки (которая должна быть дважды экранирована обратной косой чертой, один раз для Salesforce и еще раз для механизма регулярных выражений) и 1 или 2 экземпляров цифры: (\\.[0-9]{1,2}). ? означает, что вся группа должна появиться один раз или не появиться вообще. И затем %? соответствует процентной метке один раз или не соответствует вообще. Затем блок IF проверяет, что числовая часть <= 100.

2
Thomas Taylor 2 Июл 2019 в 20:37
Вы знаете, что они говорят о решении проблемы с регулярным выражением... :)
 – 
DavidSchach
2 Июл 2019 в 20:52

Salesforce Regex имеет тот же синтаксис, что и Java, за исключением экранирования \, которое необходимо преобразовать в \\. Вы можете протестировать регулярное выражение с помощью этого инструмента: https://www.freeformatter.com/java -regex-tester.html Вы также можете протестировать регулярное выражение с помощью Salesforce Apex и анонимного кода: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_pattern_and_matcher_using.htm

Что касается вашего регулярного выражения, есть несколько проблем. Во-первых, чтобы разрешить числа без цифр и символа процента, мы должны добавить ? для цифровой части и %, чтобы указать, что это необязательно. Мы также должны избегать символа точки. Регулярное выражение становится в Java: [0-9]+(\.[0-9]+)?[%]? В Salesforce: [0-9]+(\\.[0-9]+)?[%]?

Во-вторых, чтобы ограничить числа от 0 до 100, вы можете добавить к своему правилу проверки:

|| VALUE( SUBSTITUTE(Field__c, '%', '')) < 0 || VALUE(SUBSTITUTE(Field__c, '%', '')) > 100

Полное правило:

NOT(REGEX(Field__c, '[0-9]+(\\.[0-9]+)?[%]?')) || VALUE(SUBSTITUTE(Field__c, '%', '')) > 100
1
Mael Monnier 2 Июл 2019 в 17:41
1
Ваше регулярное выражение допускает более двух знаков после запятой, что, как подразумевает @learningmode, нежелательно, но это не совсем ясно. Ваше регулярное выражение Java должно экранировать ., чтобы соответствовать буквальной десятичной точке, а затем Salesforce также необходимо экранировать экранирование с помощью дополнительной обратной косой черты. Ваше использование SUBSTITUTE() умно и лучше, чем мои манипуляции со строками, но я думаю, что регулярное выражение гарантирует, что число >= 0, поэтому вам понадобится только тест <= 100.
 – 
Thomas Taylor
2 Июл 2019 в 17:30
+ применяется только к классу [0-9]. В моем ответе были удалены escape-символы. Я исправлю. И вы правы, проверять, что число >=0, не нужно.
 – 
Mael Monnier
2 Июл 2019 в 17:37
Правильно - но ваш позволяет, например, 75.678%, мой потерпит неудачу с более чем 2 цифрами после десятичной точки. Не уверен, какой режим обучения после.
 – 
Thomas Taylor
2 Июл 2019 в 17:46

Не используйте регулярное выражение. Используйте VALUE() в своем правиле проверки:

!ISNUMBER(VALUE(SUBSTITUTE(Field__c), "%",""))

Теперь вы можете добавить строку, например

0 <= VALUE(SUBSTITUTE(Field__c), "%","") <= 100

И просто вставьте правильную логику или/и биты между ними.

1
DavidSchach 2 Июл 2019 в 20:51
1
Мне нравится ваше мышление! Как написано, это решение допускает такие записи, как 6%.234 . Вы можете добавить RIGHT(Text_Field__c,1) != "%" && !ISNUMBER(IF(RIGHT(Text_Field__c,1)) , но тогда преимущество перед регулярным выражением уменьшится. И если они хотят ограничить количество знаков после запятой до 2, я думаю, что регулярное выражение лучше.
 – 
Thomas Taylor
2 Июл 2019 в 21:34