File: match_util.py

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (58 lines) | stat: -rw-r--r-- 1,993 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Regular expression helpers."""

import re


def _CreateIdentifierRegex(parts):
  assert parts
  if parts[0]:
    # Allow word boundary or a _ prefix.
    prefix_pattern = r'\b_?'
  else:
    # Allow word boundary, _, or a case transition.
    prefix_pattern = r'(?:\b|(?<=_)|(?<=[a-z])(?=[A-Z]))'
    parts = parts[1:]
    assert parts

  if parts[-1]:
    # Allow word boundary, trailing _, or single trailing digit.
    suffix_pattern = r'\d?_?\b'
  else:
    # Allow word boundary, _, or a case transition.
    suffix_pattern = r'(?:\b|(?=_|\d)|(?<=[a-z])(?=[A-Z]))'
    parts = parts[:-1]
    assert parts

  shouty_pattern = '_'.join(a.upper() for a in parts)
  snake_pattern = '_'.join(a.lower() for a in parts)
  camel_remainder = parts[0][1:]
  for token in parts[1:]:
    camel_remainder += token.title()
  first_letter = parts[0][0]
  prefixed_pattern = '[a-z]' + first_letter.upper() + camel_remainder
  camel_pattern = '[%s%s]%s' % (first_letter.lower(), first_letter.upper(),
                                camel_remainder)
  middle_patterns = '|'.join(
      (shouty_pattern, snake_pattern, prefixed_pattern, camel_pattern))
  return r'(?:%s(?:%s)%s)' % (prefix_pattern, middle_patterns, suffix_pattern)


def ExpandRegexIdentifierPlaceholder(pattern):
  """Expands {{identifier}} within a given regular expression.

  Returns |pattern|, with the addition that {{some_name}} is expanded to match:
      SomeName, kSomeName, SOME_NAME, etc.

  To match part of a name, use {{_some_name_}}. This will additionally match:
       kPrefixSomeNameSuffix, PREFIX_SOME_NAME_SUFFIX, etc.

  Note: SymbolGroup.Where* methods call this function already, so there is
  generally no need to call it directly.
  """
  return re.sub(r'\{\{(.*?)\}\}',
                lambda m: _CreateIdentifierRegex(m.group(1).split('_')),
                pattern)