正则表达式。检查并填充字符串以确保使用特定的字符串格式

标签 regex string formatting

是否可以获取一个字符串,并重新格式化它以确保输出始终具有相同的格式。

我有一个始终遵循相同格式的身份证号码:

例如

   166688205F02

   16         66882          05     F          02
 (15/16) (any 5 digit no) (05/06) (A-Z) (any 2 digit no)

有时这些表示为:

   66882 5F 2
   668825F2
   66882 5 F 2

我想采用这些惰性表达式中的任何一个,并将它们填充为如上所述的正确格式(第一组默认为 16)。

这可能吗?

最佳答案

您的号码可以通过以下正则表达式进行匹配:

^ *(1[56])? *(\d{5}) *(0?[56]) *([A-Z]) *(\d{1,2}) *$

这是一个粗略的分割。我命名了识别号的各个部分。您可能有更合适的名称。:

^ *         #Start the match at the beginning of a string and consume all leading spaces if any.
(1[56])?    #GROUP 1: The Id number prefix. (Optional)
 *          #Consume spaces if any.
(\d{5})     #GROUP 2: The five digit identifier code.
 *          #Consume spaces if any.
(0?[56])    #GROUP 3: The two digit indicator code.
 *          #Consume spaces if any.
([A-Z])     #GROUP 4: The letter code.
 *          #Consume spaces if any.
(\d{1,2})   #GROUP 5: The end code.
 *$         #End the match with remaining spaces and the end of the string.

您没有提及您正在使用的语言。这是我用 C# 编写的一个函数,它使用此正则表达式来重新格式化输入标识号。

private string FormatIdentificationNumber(string inputIdNumber) {
    const string DEFAULT_PREFIX = "16";
    const string REGEX_ID_NUMBER = @"^ *(1[56])? *(\d{5}) *(0?[56]) *([A-Z]) *(\d{1,2}) *$";
    const int REGEX_GRP_PREFIX = 1;
    const int REGEX_GRP_IDENTIFIER = 2;
    const int REGEX_GRP_INDICATOR = 3;
    const int REGEX_GRP_LETTER_CODE = 4;
    const int REGEX_GRP_END_CODE = 5;

    Match m = Regex.Match(inputIdNumber, REGEX_ID_NUMBER, RegexOptions.IgnoreCase);
    if (!m.Success) return inputIdNumber;

    string prefix = m.Groups[REGEX_GRP_PREFIX].Value.Length == 0 ? DEFAULT_PREFIX : m.Groups[REGEX_GRP_PREFIX].Value;
    string identifier = m.Groups[REGEX_GRP_IDENTIFIER].Value;
    string indicator = m.Groups[REGEX_GRP_INDICATOR].Value.PadLeft(2, '0');
    string letterCode = m.Groups[REGEX_GRP_LETTER_CODE].Value.ToUpper();
    string endCode = m.Groups[REGEX_GRP_END_CODE].Value.PadLeft(2, '0');
    return String.Concat(prefix, identifier, indicator, letterCode, endCode);
}

关于正则表达式。检查并填充字符串以确保使用特定的字符串格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229939/

相关文章:

python - 如何以绘图方式格式化数字并避免转换为百万

javascript - 提取两个字符之间的文本

java - switch 语句中的 String 如何比相应的 if-else 语句更有效?

regex - 正则表达式搜索引擎

java - 赋值和创建字符串实例有什么区别?

c++ - 计算字符串 C++ 中每个字母的频率的最有效方法是什么?

java - 将字符添加到字符串的更好方法(更优雅)

javascript - 如何在 chrome 控制台中完全打印大数组?

Python Regex - + 元字符不贪婪

java - Twitter 如何验证 URL