Регулярное выражение для однострочных комментариев



Что такое регулярное выражение для однострочных комментариев java:
Я пытаюсь использовать следующую грамматику:



     def single_comment(t):
r'//.~(n)'
#r'//.*$'
pass


Но, я не могу игнорировать комментарии одной строки, как я могу это сделать?

462   2  

2 ответов:

Регулярное выражение Python для сопоставления однострочных комментариев (только соответствует комментариям, начинающимся с//, а не /* */). К сожалению, это регулярное выражение довольно уродливо, поскольку оно должно учитывать экранированные символы и // внутри строк. Вы должны найти более понятное решение, если вам это когда-нибудь понадобится в реальном коде.

import re
pattern = re.compile(r'^(?:[^"/\\]|\"(?:[^\"\\]|\\.)*\"|/(?:[^/"\\]|\\.)|/\"(?:[^\"\\]|\\.)*\"|\\.)*//(.*)$')

Это небольшой скрипт, который запускает кучу тестовых строк против шаблона.

import re

pattern = re.compile(r'^(?:[^"/\\]|\"(?:[^\"\\]|\\.)*\"|/(?:[^/"\\]|\\.)|/\"(?:[^\"\\]|\\.)*\"|\\.)*//(.*)$')

tests = [
    (r'// hello world', True),
    (r'     // hello world', True),
    (r'hello world', False),
    (r'System.out.println("Hello, World!\n"); // prints hello world', True),
    (r'String url = "http://www.example.com"', False),
    (r'// hello world', True),
    (r'//\\', True),
    (r'// "some comment"', True),
    (r'new URI("http://www.google.com")', False),
    (r'System.out.println("Escaped quote\""); // Comment', True)
]

tests_passed = 0

for test in tests:
    match = pattern.match(test[0])
    has_comment = match != None
    if has_comment == test[1]:
        tests_passed += 1

print "Passed {0}/{1} tests".format(tests_passed, len(tests))

Я думаю, что это работает (используя pyparsing):

data = """
class HelloWorld {

    // method main(): ALWAYS the APPLICATION entry point
    public static void main (String[] args) {
        System.out.println("Hello World!"); // Nested //Print 'Hello World!'
        System.out.println("http://www.example.com"); // Another nested // Print a URL
        System.out.println("\"http://www.example.com"); // A nested escaped quote // Print another URL
    }
}"""


from pyparsing import *
from pprint import pprint
dbls = QuotedString('"', '\\', '"')
sgls = QuotedString("'", '\\', "'")
strings = dbls | sgls
pprint(dblSlashComment.ignore(strings).searchString(data).asList())

[['// method main(): ALWAYS the APPLICATION entry point'],
 ["// Nested //Print 'Hello World!'"],
 ['// Another nested // Print a URL'],
 ['// A nested escaped quote // Print another URL']]

Если у вас есть комментарии в стиле /* ... */, которые имеют однострочные комментарии в них, и на самом деле не хотят их, то вы можете использовать:

pprint(dblSlashComment.ignore(strings | cStyleComment).searchString(data).asList())

(Как обсуждалось в http://chat.stackoverflow.com/rooms/26267/discussion-between-nhahtdh-and-martega)

Comments

    Ничего не найдено.