使用Regex,如何检查倒数第二个字符是否为奇数

时间:2018-04-04 22:41:50

标签: javascript regex

我正试图围绕正则表达式,但在基础知识方面遇到了一些麻烦。

我想查看字符串中的最后一个字符是“0”还是“5”,但我还要检查是否倒数第二个字符(如果存在)是奇数

如果重要,我正在尝试在Javascript中执行此操作以进行某些表单验证。我有以下正则表达式来满足我检查最后一个字符并确保其为“0”或“5”的第一个条件

/([0|5]$)/g

但是如何正确添加第二个条件以查看倒数第二个字符是否存在并且是奇数?像下面的东西......?

/([0|5]$)([1|3|5|7|9]$-1)/g

如果有人不介意在这里帮助我并向我解释他们的正则表达式的每个部分正在做什么,我将非常感激。

6 个答案:

答案 0 :(得分:2)

你正在以错误的方式思考它。

试试这个:

/([13579])([05])$/g

答案 1 :(得分:1)

我会选择/(?<=[13579]{1})[05]|^[05]$/

这利用了两个条件。当字符串中至少有两个字符时,检查倒数第二个位置是否存在奇数字符,以及检查单个字符串的字符。

打破这个局面:

  • (?<=[13579]{1}) - 对一个奇怪的角色执行 https://stackoverflow.com/help/on-topic
  • [05] - 直接跟踪后面的05
  • | - 表示OR
  • ^表示字符串的开头
  • [05] - 匹配05
  • $ - 字符串的结尾

这可以在以下内容中看到:

var re = /(?<=[13579]{1})[05]|^[05]$/;
console.log(re.test('12345')); // 12345 should return `false`
console.log(re.test('12335')); // 12335 should return `true`
console.log(re.test('1')); // 1 should return `false`
console.log(re.test('5')); // 5 should return `true`

也见于 positive lookbehind

答案 2 :(得分:1)

如果你想检查字符串中的最后一个字符是“0”还是“5”,还想检查倒数第二个字符(如果存在)是否是奇数,我认为你做的不需要捕获组。

您可以根据自己的要求使用alternationcharacter classes

(?:\D[05]|[13579][05]|^[05])$

那将匹配:

  • (?:非捕获组
    • \D[05]不匹配数字,0或5
    • |
    • [13579][05]匹配一个奇数位和0或5
    • |
    • ^[05]从字符串0或5的开头匹配
  • )关闭非捕获组
  • $断言行尾

const strings = [
  "00",
  "11",
  "text1",
  "text10",
  "text00",
  "text5",
  "10",
  "05",
  "15",
  "99",
  "12345",
  "12335",
  "0000",
  "0010",
  "5",
  "1",
  "0",
];
let pattern = /(?:[13579][05]|\D[05]|^[05])$/;
strings.forEach((s) => {
  console.log(s + " ==> " + pattern.test(s));
});

答案 3 :(得分:0)

/(^|[13579])[05]$/

说明:

[05]$表示&#34; 0或5后跟字符串结尾&#34;

(^|[13579])表示&#34;字符串开头OR 1或3或5或7或9&#34;

在控制台中测试:

re.test('aaa0') - false
re.test('aa15') - true
re.test('aa20') - false
re.test('0') - true

这是你追求的吗?

答案 4 :(得分:0)

正如你所说

  

我想检查字符串中的最后一个字符是否是&#34; 0&#34;或者&#34; 5&#34;,但我也想检查是否倒数第二个字符(如果存在)是奇数

试试这个:

&#13;
&#13;
var rgx = /^([1-9]+[13579][05]|[1-9][05])$/;

function test(str) {
  for (var i = 0; i < str.length; i++) {
    var res = str[i].match(rgx);
    if (res) {
      console.log("match");
    } else {
      console.log("not match");
    }
  }
}

var arr = ["12335", "12350", "45", "10", "12337", "11", "01", "820"];

test(arr);
&#13;
&#13;
&#13;

答案 5 :(得分:-1)

你想要这样做:

/(^|[1|3|5|7|9])([0|5])$/

https://regex101.com/r/nMX7L2/4

  

第一捕获组(^ | [1 | 3 | 5 | 7 | 9])

     

第一选择^

     

^在字符串

的开头处断言位置      

第二选择[| 1 | 3 | 5 | 7 | 9]

     

匹配下面列表中的单个字符[| 1 | 3 | 5 | 7 | 9]   | 1 | 3 | 5 | 7 | 9匹配列表中的单个字符| 13579(区分大小写)

     

匹配下面列表中的单个字符[1 | 3 | 5 | 7 | 9]

     

1 | 3 | 5 | 7 | 9匹配列表中的单个字符1 | 3 | 5 | 7 | 9(区分大小写)

     

第二捕获组([0 | 5])

     

匹配[0 | 5]

下面列表中的单个字符      

0 | 5匹配列表0 | 5中的单个字符(区分大小写)

     

$断言字符串末尾的位置,或者在字符串末尾的行终止符之前(如果有的话)