时间格式的正则表达式

时间:2017-10-03 15:39:22

标签: regex

有人能用以下格式给我一个正则表达式吗?我尝试了一些但没有运气。

格式适用于以下时间:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_inner_basics) {


        AlertDialog.Builder builder = new AlertDialog.Builder(this); 

        int[] screenSize= getScreenSIze(); //This is the method above remember
        int width=screenSize[0];
        int height=screenSize[1];

        int webViewWidth=(int)(0.8*width); //Casting to make them int
        int webViewHeight=(int)(0.7*height);

        android.webkit.WebView wv = new WebView(this);

        wv.setMinimumHeight(webViewHeight);
        wv.setMinimumWidth(webViewWidth);

        wv.loadUrl("file:///android_asset/test.html");

        builder.setView(wv);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
       builder.show();
    }


    return super.onOptionsItemSelected(item);
}

它不应该匹配

07:00 AM
12:00 PM

时间始终为7:00 7:00 AM

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以用这个:

\d{2}:\d{2}\s(?:AM|PM)

符合此时间格式:hh:mm [AM|PM]

但不匹配:h:mmh:mm [AM|PM]

这是以上的正则表达式示例:

https://regex101.com/r/IFsyH1/1

注意:如果您不希望[AM | PM]区分大小写,只需添加i标记。

答案 1 :(得分:0)

初步答复

由于你没有指定语言/正则表达式的味道,我会假设一切都

代码

See regex in use here

(?i)((?:0[1-9]|1[0-2]):[0-5]\d\s*[AP]M)\s+(?-1)

注意:如果这是字符串的唯一内容,您可以在开头添加^,在字符串末尾添加$。如果这是较大字符串的内容,我建议将正则表达式包装在单词边界\b中,以确保匹配之前/之后的内容不是单词字符(a-zA-Z0-9_)。

结果

输入

07:00 AM 12:00 PM
7:00 7:00 AM

输出

注意:以下输出仅显示

以上输入的匹配项
07:00 AM 12:00 PM

说明

  • (?i)将模式的其余部分与i标志
  • 相加
  • ((?:0[1-9]|1[0-2]):(?:[0-5]\d)\s*[AP]M)将以下内容捕获到第一个捕获组中
    • (?:0[1-9]|1[0-2])匹配以下任一项(任何有效小时)
      • 0[1-9]匹配0,后跟1-90109)范围内的数字
      • 1[0-2]匹配1,后跟0-21012)范围内的数字
    • :字面上匹配冒号字符
    • [0-5]\d匹配0-5范围内的数字,后跟任意数字(分钟范围从0059
    • \s*匹配任意数量的空白字符(您可以将此更改为\h*以获取PCRE正则表达式中的水平空格或[ \t],以便更常用,仅接受空格或制表符)
    • [AP]M匹配AMPM(使用i修饰符,这也会匹配任何组合,包括小写字符,例如am,{{ 1}},Am
  • aM匹配一个或多个空格字符(与之前的\s+相同的规则可应用于此)
  • \s*递归第一个子模式(确保第二个时间戳存在)

修改

看到你现在如何编辑你的问题以更好地显示输入/输出期望,我将编辑我的答案。它与我上面的内容非常相似,只是没有结尾,所以解释仍然正确地解释了这个正则表达式。

代码

See it in use here

(?-1)

注意:这会使用(?:0[1-9]|1[0-2]):[0-5]\d\s*[AP]M 修饰符(或者您可以将i添加到正则表达式中以使其不区分大小写)

结果

输入

(?i)

输出

注意:以下输出仅显示

以上输入的匹配项
07:00 AM
12:00 PM
7:00
7:00 AM