请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

四种情况的代码演示

四种情况:

  1. 无模式
  2. s*
  3. .*
  4. .
    export default (str, pattern) => {
      /**
     * 如何分组?
     * split?
     *    1.如何用于分组的断点不被刨除。
     *    2.断点进行分组
     * match?
     *    1.将字符串完全匹配
     *    2.需要分组的部分使用排他性的组合
     */
      const modeArr = pattern.match(/([a-z.]\*)|(\.)|([a-z]+(?=([a-z.]\*)|$))/g)
      // const modeArr = pattern.split(/([a-z.]\*)|(\.)|([a-z]+(?=([a-z.]\*)|$))/g).filter(item => !!item)
      let rest = str
      for (let i = 0, length = modeArr.length; i < length; i++) {
        const mode = modeArr[i]
        if (mode.indexOf('.') !== -1 || mode.indexOf('*') !== -1) {
          if (mode === '.') {
            rest = rest.slice(1)
          } else if (mode === '.*') {
            rest = rest.slice(rest.match(new RegExp(`${rest.charAt(0)}*`))[0].length)
          } else {
            if (rest.charAt(0) === mode[0]) {
              rest = rest.slice(rest.match(new RegExp(`${rest.charAt(0)}*`))[0].length)
            } else {
              return false
            }
          }
        } else {
          if (rest.slice(0, mode.length) === mode) {
            rest = rest.slice(mode.length)
          } else {
            return false
          }
        }
      }
      if (rest) {
        return false
      }
      return true
    }

测试用例

import regModeStr from '../../code/regexp/lesson2'

test('regModeStr', () => {
  expect(regModeStr('aaa', 'caa*')).toBe(false)
})
test('regModeStr:2', () => {
  expect(regModeStr('aaabc', 'a*bc')).toBe(true)
})
test('regModeStr:3', () => {
  expect(regModeStr('aaabc', 'a*.*')).toBe(false)
})

test('regModeStr:4', () => {
  expect(regModeStr('aa', '.a')).toBe(true)
})

test('regModeStr:5', () => {
  expect(regModeStr('aab', '.*')).toBe(false)
})

正在回答 回答被采纳积分+3

2回答

提问者 _玲 2019-02-25 21:37:08

test('regModeStr:4', () => {

    expect(regModeStr('aaaaaaac', 'a*ac')).toBe(true)

})

测试用例跑不过!!!!


0 回复 有任何疑惑可以回复我~
  • 提问者 _玲 #1
    考虑优先匹配无模式的子串,再考虑有模式的。
    回复 有任何疑惑可以回复我~ 2019-02-25 21:37:30
  • 快乐动起来呀 回复 提问者 _玲 #2
    嗯嗯,这个感觉大家说的有道理,.*不能直接匹配所有,要考虑后续的字符串,要开启贪婪模式,代码随后更新,敬请关注
    回复 有任何疑惑可以回复我~ 2019-02-28 14:51:15
  • 快乐动起来呀 回复 提问者 _玲 #3
    嗯嗯,这个测试用例反馈的非常棒,代码随后更新
    回复 有任何疑惑可以回复我~ 2019-02-28 14:51:59
快乐动起来呀 2019-02-25 09:34:21

还有一种.*a

0 回复 有任何疑惑可以回复我~
  • 提问者 _玲 #1
    .*a不属于.*么,比如,下边这种测试用例就能通过
    
    test('regModeStr:4', () => {
      expect(regModeStr('bbbba', '.*a')).toBe(true)
    })
    回复 有任何疑惑可以回复我~ 2019-02-25 09:48:23
  • 我之前也是这么处理的,但是大家觉得不应该放在一起,我觉得也有道理
    回复 有任何疑惑可以回复我~ 2019-02-25 10:10:55
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信