Nano Hash - криптовалюты, майнинг, программирование

REGEX для управления назначениями переменных в строках

Мне нужно регулярное выражение для моего PHP-скрипта, которое поможет мне манипулировать некоторыми строками с помощью preg_replace.

Например, скажем, у меня есть следующая строка:

myvar = first_value AND var2 = second_value

Я хотел бы преобразовать его в:

myvar = 'first_value' AND var2 = 'second_value'

Однако я также хотел бы, чтобы он игнорировался, когда вокруг значения уже есть одинарная кавычка. Таким образом, myvar = first_value AND var2 = 'second_value' станет myvar = 'first_value' AND var2 = 'second_value', а не myvar = 'first_value' AND var2 = ''second_value''.

Я также хотел бы иметь дело с пробелами внутри подстрок, когда вокруг значения уже есть одинарная кавычка. Таким образом, myvar = first_value AND var2 = 'second value' станет myvar = 'first_value' AND var2 = 'second value', а не myvar = 'first_value' AND var2 = 'second' value'.

ПРИМЕЧАНИЕ. Строка никогда не будет содержать присвоение переменной со строковыми значениями без кавычек, в которых есть пробелы, т. е. myvar = first value — это сценарий, который никогда не возникнет. Однако строка может содержать любой другой символ, даже специальные символы, например. myvar = &%$@_imspecial_* полностью действителен.

Код PHP, с которым я работал, выглядел примерно так, как показано ниже (#DontLugh):

$col_clause_str = "myvar = first_value AND var2 = second_value";
$replace_pattern_str = '/([\w\@\-]+)\s*(\=|\>|\>\=|\<|\<\=)\s*\'{0,1}([\w\@\.\:\+\-\/\|\{\}\[\]\~\%\$\*\!]+)\'{0,1}/i';
$replace_str = '\1 \2 \'\3\'';
$col_clause_str = preg_replace($replace_pattern_str, $replace_str, $col_clause_str);

Как я могу улучшить это регулярное выражение?!

Заранее спасибо.

EDIT: я обновил вопрос, чтобы он был более описательным.

26.12.2012

Ответы:


1

Вы можете заменить это регулярное выражение: -

"/(?<==\s)(\w+)/i"

с: -

'\1'

Обновление: -

Хорошо, для вашего обновленного вопроса вы можете использовать это регулярное выражение: -

"/(?<==\s)([^\s']+)/i"

И замените его той же строкой - '\1'

26.12.2012
  • @mellamokb Я думаю, он хочет только упорядочить присвоения переменных. И это прекрасно работает. 26.12.2012
  • @ Чак .. Хорошо, я обновил ответ. Проверьте, охватывает ли он все ваши возможности. 26.12.2012
  • @Rohit Нет, это не работает. Вот что я сделал, и вы можете попробовать сами: $col_clause_str = "myvar = first_value AND var2 = second_value"; $replace_pattern_str = '/(?<==\s)([^\s\']+)/i'; $replace_str = '\1'; $col_clause_str = preg_replace($replace_pattern_str, $replace_str, $col_clause_str); 26.12.2012
  • Хорошо, а что вы получили и чего ожидали? Я пробовал это, и это работает на Java. И он обязательно должен работать с preg_replace. 26.12.2012
  • @Rohit Ну, я не использую Java ... Я использую PHP, как описано в моем вопросе. 26.12.2012
  • @ChuckUgwuh. Да, это я понимаю. Но это также будет работать в preg_replace. Что вы получили на выходе, когда попробовали? 26.12.2012
  • @ChuckUgwuh .. Хорошо, кажется, есть какая-то проблема. Позвольте мне исправить это. 26.12.2012
  • @ChuckUgwuh .. Нет, он отлично работает в соответствии с вашими требованиями. Я протестировал его на functions-online.com/preg_replace.html. 26.12.2012
  • См. это: - regex-test.com/share-url.php?url=validate/php/. 26.12.2012
  • @Rohit Хорошо, мне пришлось внести несколько правок в свой код, прежде чем я смог заставить его работать, но теперь он работает. Спасибо. 26.12.2012

  • 2

    Я не знаком с PHP и его возможностями регулярных выражений, но, возможно, этот код Python немного поможет вам:

    In [1]: import re
    
    In [2]: str1 = "myvar = first_value AND var2 = second_value"
    
    In [3]: str2 = "myvar = first_value AND var2 = 'second_value'"
    
    In [4]: str3 = "myvar = 'first value' AND var2 = second_value"
    
    In [5]: regex = r"""
     .....:     (?P<variable_name>
     .....:         \w+
     .....:         \s*
     .....:         =
     .....:         \s*
     .....:     )
     .....:     (?<! ' )     # negative look-behind assertion
     .....:     (?P<value>
     .....:         \w+
     .....:     )
     .....:     (?! ' )      # negative look-ahead assertion
     .....:     """
    
    In [6]: replacement = "\g<variable_name>'\g<value>'"
    
    In [7]: re.sub(regex, replacement, str1, flags=re.X)
    Out[7]: "myvar = 'first_value' AND var2 = 'second_value'"
    
    In [8]: re.sub(regex, replacement, str2, flags=re.X)
    Out[8]: "myvar = 'first_value' AND var2 = 'second_value'"
    
    In [9]: re.sub(regex, replacement, str3, flags=re.X)
    Out[9]: "myvar = 'first value' AND var2 = 'second_value'"
    

    Вероятно, вам придется настроить \w+ так, чтобы он соответствовал всем символам, которые могут быть в ваших именах переменных. Идея здесь состоит в том, чтобы использовать отрицательные утверждения просмотра назад и вперед, чтобы проверить, заключено ли уже значение переменной в кавычки.

    26.12.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..