Регулярное выражение для поиска точек разделителя в формуле - PullRequest
3 голосов
/ 01 марта 2011

Библиотека выражений C #, которую я использую, не будет напрямую поддерживать синтаксис моего параметра таблицы / поля:

Ниже приведены имена параметров таблицы / поля, которые не поддерживаются напрямую:

TableName1.FieldName1
[TableName1].[FieldName1]
[Table Name 1].[Field Name 1]

Он принимает буквенно-цифровые параметры без пробелов, или большинство символов заключено в квадратные скобки. Я хотел бы использовать регулярные выражения C # для замены разделителей точек и соседних скобок на другой разделитель, поэтому результаты будут следующими:

[TableName1|FieldName1]
[TableName1|FieldName1]
[Table Name 1|Field Name 1]

Мне также нужно пропустить любые строковые литералы в одинарных кавычках, например:

'TableName1.FieldName1'

И, конечно же, игнорировать любые числовые литералы, такие как:

12345.6789

РЕДАКТИРОВАТЬ: Спасибо за ваш отзыв по улучшению моего вопроса. Надеюсь, теперь все стало понятнее.

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Я написал совершенно новый ответ, теперь, когда проблема прояснена:

Вы можете сделать это в одном регулярном выражении.Это довольно пуленепробиваемый, я думаю, но, как вы можете видеть, это не совсем очевидно, поэтому я прокомментировал это свободно.Надеюсь, это имеет смысл.

Вам повезло, что .NET позволяет повторно использовать именованные группы захвата, в противном случае вам пришлось бы сделать это в несколько шагов.

resultString = Regex.Replace(subjectString, 
    @"(?:             # Either match...
     (?<before>       #  (and capture into backref <before>)
      (?=\w*\p{L})    #  (as long as it contains at least one letter):
      \w+             #  one or more alphanumeric characters,
     )                #  (End of capturing group <before>).
     \.               #  then a literal dot,
     (?<after>        #  (now capture again, into backref <after>)
      (?=\w*\p{L})    #  (as long as it contains at least one letter):
      \w+             #  one or more alphanumeric characters.
     )                #  (End of capturing group <after>) and end of match.
    |                 # Or:
     \[               #  Match a literal [
     (?<before>       #  (now capture into backref <before>)
      [^\]]+          #  one or more characters except ]
     )                #  (End of capturing group <before>).
     \]\.\[           #  Match literal ].[
     (?<after>        #  (capture into backref <after>)
      [^\]]+          #  one or more characters except ]
     )                #  (End of capturing group <after>).
     \]               #  Match a literal ]
    )                 # End of alternation. The match is now finished, but
    (?=               # only if the rest of the line matches either...
     [^']*$           #  only non-quote characters
     |                # or
     [^']*'[^']*'     #  contains an even number of quote characters
     [^']*            #  plus any number of non-quote characters
     $                #  until the end of the line.
    )                 # End of the lookahead assertion.", 
    "[${before}|${after}]", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
0 голосов
/ 01 марта 2011

надеюсь, что вы можете попробовать это регулярное выражение: /(\w[0-9]* *)+/g это отфильтровывает все буквенно-цифровые, кроме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...