4位正则表达式,可能以0开头

时间:2018-09-01 06:18:45

标签: regex nsregularexpression digit qregularexpression

public class Program
{
    static void Main(string[] args)
    {
        string input = "104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100";

        String output = String.Empty;

        foreach (var item in input.Split(',').ToArray())
        {
            int unicode = Convert.ToInt32(item);
            var converted = char.ConvertFromUtf32(unicode);
            output += converted;
        }

        Console.WriteLine(output);
        Console.ReadLine();
    }
}

我有这个正则表达式 可以找到

\b(0?[1-9]){4}

但不是

1234 

找到01234,且超过4位数字

我的正则表达式的哪一部分错了?

2 个答案:

答案 0 :(得分:4)

正则表达式的问题在于,您为{0}匹配指定了import os import xlsxwriter def write_captions_to_excel_file(data_list, description_path, headers): workbook = xlsxwriter.Workbook(os.path.join(description_path, 'all_captions.xlsx')) worksheet = workbook.add_worksheet() for row, data in enumerate(data_list): for col, header in enumerate(headers): if header == 'Titles': text_to_write = data[header] else: text_to_write = data[header].h1.getText().capitalize() worksheet.write(row+1, col, text_to_write) def some_function(): headers = ['Image name', 'Titles', 'Description'] description_path = 'some/path/to/file' filenames = ['x', 'y', 'z'] titles = ['z', 'y', 'x'] data_list = [] for i, j in enumerate(filenames): combined_dict = dict() combined_dict['Image name'] = j combined_dict['Titles'] = titles[i] data_list.append(combined_dict) write_captions_to_excel_file(data_list, description_path, headers) ,这意味着0或1个匹配项。因此,您可以匹配5位数的字符串(以及更大的字符串)。

问题是?贡献0或1,然后您的?测试总是贡献1。您进行了4次匹配,因此可以匹配从4位到8位的任何内容数字字符串。

这是一个更简单的版本,您可以使用https://regexr.com/进行测试。

1-9

这将根据需要在第一个位置测试0-9,然后在接下来的3个位置测试1-9。

示例输出

\b[0-9][1-9]{3}\b

答案 1 :(得分:3)

您的量词用于整个组,因此您也可以将01020304与当前的正则表达式匹配。

在这种情况下,最简单的解决方案似乎是一种替代方案:

\b(?:0[1-9]{3}|[1-9]{4})\b

请注意,这将不匹配包含0之类的数字,例如3000

但是,如果您只是想确保不匹配0000,则可以改用超前行

\b(?!0{4})\d{4}\b