我很难找到以下示例的正则表达式模式(在python中(
字符串应该以1到99之间的数字开头,2或3个CCD_ 1标记。其他任何东西都是无效的
""
->NOK(必须至少包含一个数字("1"
->ok"99"
->ok-
"100"
->NOK(最大数量为99( -
"1*"
->ok "1**"
->好"1***"
->好-
"1****"
->NOK(最大3*s( -
*
0->ok -
"*1"
->NOK(*仅在背面( "1*1"
->NOK(*仅在背面("1 *"
->NOK(包含空格:不是数字或*(
我走到了这一步:"^[0-9]{1,2}|^([0-9]{1,2})(Z*)"
但未发现CCD_ 15或CCD_
以下是python代码和测试:
import re
class ControlePunt:
@staticmethod
def create(punt):
should_start_with_number_and_may_end_with_marker = "^[0-9]{1,2}|^([0-9]{1,2})(Z*)"
if re.match(should_start_with_number_and_may_end_with_marker, punt):
return ControlePunt(punt)
else:
return NoControlePunt()
def __init__(self, punt):
self.punt = punt
class NoControlePunt(ControlePunt):
def __init__(self):
super().__init__("")
import unittest
from ControlePunt import ControlePunt, NoControlePunt
class ValidControlePuntTests(unittest.TestCase):
def test_valid_numeric(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21")).__name__)
def test_valid_numeric_with_1_marker(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21*")).__name__)
def test_valid_numeric_with_2_markers(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21**")).__name__)
def test_valid_numeric_with_3_markers(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21***")).__name__)
class InvalidControlePuntTests(unittest.TestCase):
def test_empty(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("")).__name__)
def test_only_marker(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("*")).__name__)
def test_non_numeric(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("a1")).__name__)
def test_marker_before_numbers(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("*1")).__name__)
def test_marker_surrounded_by_numbers(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("1*1")).__name__)
def test_containing_illegal_characters(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("1 *")).__name__)
if __name__ == '__main__':
unittest.main()
也许这个正则表达式会有所帮助?
should_start_with_number_and_may_end_with_marker = "^[1-9][0-9][*]{0,3}"
Regex:r'^[1-9][0-9]?[*]{0,3}$'
匹配测试用例。
解释
^[1-9]
-1到9是第一个字符[0-9]?
-可选第二个字符0到9[\*]{0,3}$
-字符串末尾的0到3*