正则表达式 - 两位数字范围(23-79)?

15

我一直在阅读这个网站上关于正则表达式的问题,但我的问题似乎有些不同。 我需要匹配一个两位数,例如23到75。 我是在HP-UX Unix系统上进行这个操作的。 我找到了3-44或任何数字长度的示例,但没有固定长度的内容,这有点令人惊讶,但也许我没有理解变量长度示例的答案。


6
您确定要在这里使用正则表达式吗?如果范围将来可能会更改,使用整数类型的转换然后进行整数比较可能更为适合。 - Paul
2
让我赞同@Paulpro的建议 - 虽然正则表达式可以做到这一点,但它是一个不好的(我很想说“可怕”的)工具。 - Jerry Coffin
1
@AbsoluteƵERØ 我不熟悉HP-UX,但他可以在任何命令行上执行此操作,对吧?我相信你可以在HP-UX上安装像bash这样的shell。如果它在某个脚本中,那么当范围发生变化时,需要更改的只是代码中范围的边界,而不是正则表达式。如果它不是在脚本中,只是一次性的操作,那么在我看来,正则表达式是完全有效的方法。顺便说一句,你的答案非常好,非常适合OP的问题 :) - Paul
1
@AbsoluteƵERØ:您没听懂“为了工作”的哪一部分吗?我们中有些人是真正关心可读性和可维护性等方面的专业人士,而不仅仅是在某些特定情况下能够快速编写出有效代码的能手。 - Jerry Coffin
1
@AbsoluteƵERØ:你仍然没有解释你不理解“为这份工作”的哪一部分,但是你已经更加清楚地表明你根本不理解这个概念。HP-UX在这里几乎完全无关紧要——它是一个相当普通的UNIX系统,具有所有通常的工具。当然,由于OP没有解释他真正要做的工作,所以很难确定什么是正确的,尽管他已经说了足够的话来表明正则表达式是错误的选择。 - Jerry Coffin
显示剩余6条评论
6个回答

16

由于您没有说明这是否是除其他字符之外的内容(或者在更大的字符串中间),因此我在这里包含逻辑以指示您需要匹配字符串的数字部分。这应该可以帮助您实现。我们正在创建第二个数字的范围,仅允许那些字符。然后,我们将其与其他范围进行比较,使用or

(2[3456789]|[3456][0-9]|7[012345])

正如oded指出的那样,您也可以这样做,因为子范围也被接受(取决于您使用的应用程序中REGEX的实现):

(2[3-9]|[3-6][0-9]|7[0-5])

根据标题,将最后的5更改为9即可从75-79:

(2[3-9]|[3-6][0-9]|7[0-9])

如果您想将这些数字作为字符串进行特定匹配(从开头到结尾),则需要使用修饰符^$来表示字符串的开头和结尾。
这里有一个优秀的正则表达式范围的技术参考链接: http://www.regular-expressions.info/numericranges.html 如果您正在使用像grep这样的工具,并尝试匹配包含其他内容的数字行,则可以使用类似于以下范围的内容:匹配79及以下的行。
grep "[^0-9]?(2[3-9]|[3-6][0-9]|7[0-9])[^0-9]?" folder

3
可以缩写为(2[3-9]|[3-6][0-9]|7[0-5]) - Oded
没错。我遇到过某些情况,其中并非每个实现都能正常工作,但根据标准来看应该是可以的。 - AbsoluteƵERØ
1
如果您传递了2345,则此代码将返回true。 - Desolator
@RobinVanPersi 我们正在使用 | 表示或,同时使用 [] 括号来指示允许的字符。 - AbsoluteƵERØ
1
@RobinVanPersi,原帖没有指明这是否是在字符串中间。 - AbsoluteƵERØ
对于所有提供答案的人,我真诚地感谢你们。三部分范围答案可行。我很抱歉,我应该说明我正在为SCP操作选择文件。我正在选择用于SCP文件传输的文件,并且它们位于字符串的中间。到目前为止,我一直不得不进行多个SCP运行,因为我无法弄清楚如何将其拆分。再次感谢! - user2414817

4
这个工具正是您需要的:Regex_For_Range 从29到79:\b(2[3-9]|[3-7][0-9])\b 从29到75:\b(29|[3-6][0-9]|7[0-5])\b 还有一个好玩的,从192到1742:\b(19[2-9]|[2-9][0-9]{2}|1[0-6][0-9]{2}|17[0-3][0-9]|174[0-2])\b :)

工具现在有凭据提示,你知道所有者是谁吗? - weston
@weston 真遗憾!我会联系他们了解这个身份验证的原因,然后再回复你。 - sp00m
如果你认识他们,也许你可以说服他们开源它。在GitHub上发布或在这里发布。 - weston

2
如果我想要一个0-63的两位数范围
/^[0-9]|[0-5][0-9]|6[0-3]$/
  1. [0-9] 允许从 0 到 9 的单个数字
  2. [0-5][0-9] 允许从 00 到 59 的数字
  3. 6[0-3] 允许从 60 到 63 的数字

通过这种方式,您可以为任何两位数范围使用正则表达式


0

仅补充一点,这里提供了一个用JavaScript生成字符串的解决方案。您可以单击“运行代码段”以输入自己的范围并获取自己的字符串。

function regexRangeString(lower,upper){
  let current=lower;
  let nextRange=function(){
    let currentString=String(current);
    let len=currentString.length;
    let string="";
    let newUpper;
    for(let digit=0;digit<len;digit++){
      let index=len-digit-1;
      let lower=Number(currentString[index]);
      let thisString="";
      for(let u=9;u>=lower;u--){
        let us=currentString.substring(0,index)+u+currentString.substring(index+1,len);
        if(Number(us)<=upper){
          if(lower==u){
            thisString=lower;
          }
          else{
            thisString=`[${lower}-${u}]`;
          }
          currentString=currentString.substring(0,index)+u+currentString.substring(index+1,len);
          break;
        }
      }
      if(thisString!="[0-9]"){
        string=currentString.substring(0,index)+thisString+string;
        break;
      }
      else{
        string=thisString+string
      }
    } 
    current=Number(currentString)+1;
    return string
  }

  let string=""
  while(current<upper){
    string+="|"+nextRange(current);
  }
  string="("+string.slice(1)+")";
  return string
}


let lower=prompt("Enter Lower Bound")
let upper=prompt("Enter Upper Bound")
alert(regexRangeString(lower,upper))

例如:

regexRangeString(72,189)

生成以下输出字符串:

(7[2-9]|[8-9][0-9]|1[0-8][0-9])

0

你有两类数字需要匹配:

  • 数字2,后跟3到9之间的任意一个数字
  • 3到7之间的任意一个数字,后跟任意一个数字

编辑:好吧,那是标题范围(23-79)。在你的问题(23-75)中,你有三个:

  • 数字2,后跟3到9之间的任意一个数字
  • 3到6之间的任意一个数字,后跟任意一个数字
  • 数字7,后跟0到5之间的任意一个数字

几乎 - 最多到 75,而不是 79 - Oded
@Oded,原帖主题写的是79,正文中写的是75。不清楚他真正想要的是哪一个。 - Paul
抱歉标题示例中的错别字,两个数字只是示例,关键点是只有2位数字。但我理解你的意思,79确实适合[3-7][0-9]的整个范围,75更准确,因为我不能总是填满整个范围。因此,我想要的是包含3个部分范围的答案。 - user2414817

-2

这应该可以解决问题:

/^([2][3-9]|[3-6][0-9]|[7][0-5])$/

^$ 将使其严格匹配仅为2个数字,所以如果您有即234则无法工作。


1
另外,如果他们使用类似于grep的东西来匹配包含他们搜索的数字的行,这也不起作用。 - AbsoluteƵERØ
1
@AbsoluteƵERØ - 我的朋友,我没有给你的答案投反对票。我花了超过5分钟来测试要求,然后发布了它,然后才检查了你的答案。 - Desolator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接