Как объяснить причудливое поведение JavaScript, упомянутое в выступлении «Wat» для CodeMash 2012?

Этот протестированный скрипт должен выполнить трюк:

import re
re_sq_long = r"""
    # Match single quoted string with escaped stuff.
    '            # Opening literal quote
    (            # $1: Capture string contents
      [^'\\]*    # Zero or more non-', non-backslash
      (?:        # "unroll-the-loop"!
        \\.      # Allow escaped anything.
        [^'\\]*  # Zero or more non-', non-backslash
      )*         # Finish {(special normal*)*} construct.
    )            # End $1: String contents.
    '            # Closing literal quote
    """
re_sq_short = r"'([^'\\]*(?:\\.[^'\\]*)*)'"

data = r'''
        menu_item = 'casserole';
        menu_item = 'meat 
                    loaf';
        menu_item = 'Tony\'s magic pizza';
        menu_item = 'hamburger';
        menu_item = 'Dave\'s famous pizza';
        menu_item = 'Dave\'s lesser-known
            gyro';'''
matches = re.findall(re_sq_long, data, re.DOTALL | re.VERBOSE)
menu_items = []
for match in matches:
    match = re.sub('\s+', ' ', match) # Clean whitespace
    match = re.sub(r'\\', '', match)  # remove escapes
    menu_items.append(match)          # Add to menu list

print (menu_items)

Вот краткая версия регулярного выражения:

'([^'\\]*(?:\\.[^'\\]*)*)'

Это регулярное выражение оптимизировано с использованием метода эффективности Джеффри Фридла «разворачивание-цикл» . (См.: Освоение регулярных выражений (3-е издание) ).

Обратите внимание, что указанное выше регулярное выражение эквивалентно следующему (которое чаще всего встречается, но в большинстве реализаций регулярных выражений NFA оно намного медленнее):

'((?:[^'\\]|\\.)*)'

729
задан Esailija 13 August 2012 в 20:23
поделиться