Поиск всех примеров химических формул с регулярным выражением в php - PullRequest
0 голосов
/ 06 января 2019

У меня есть следующая строка: «AZS40G - это алюмосиликатный циркониевый материал с содержанием ZrO2 не менее 39%, который служит отличным заменителем в приложениях для производства спеченных огнеупоров AZS и где требуется муллит из плавленого циркона. C1R5».

Я хотел бы использовать регулярное выражение, чтобы найти все цифры в химических формулах в тексте (экземпляры букв, предшествующих цифрам, за исключением сокращений обозначений, т. Е. «AZS40G» в данном случае, и обернуть их тегом <sub></sub>.

Я делаю все это в php, и поскольку я не знаю, с чего начать с регулярного выражения, я предоставил следующий пример псевдокода / php:

$text = "AZS40G is Alumina Zircon Silicate material with ZrO2 content of 39% minimum, which serves as a great substitute in applications for production of sintered AZS refractories and where the Fused Zircon mullite is required. Zr5O2, M20R2, C1R5";
preg_replace('/(AZS40G!)(?<=[A-Z])\d+/', '<sub>${1}</sub>', $text);

Ожидаемый результат будет для всех случаев следующим образом:

У меня есть следующая строка: «AZS40G - это глинозем Циркон Силикатный материал с содержанием ZrO 2 минимум 39%, который служит отличным заменителем в приложениях для производства спеченных огнеупоров AZS и где плавленый циркон требуется муллит. C 1 R 5".

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Используйте skip / fail для перемещения за аббревиатурами.

\b(?:AZS40G|BZS40G|CZS40G)\b(*SKIP)(*FAIL)|(?<=[A-Z])(\d+)

https://regex101.com/r/VglQ3K/1

Расширен

   \b                         
   (?: AZS40G | BZS40G | CZS40G )      # exclude the designates abbreviation
   \b 
   (*SKIP) (*FAIL)                     # Will move the current position past this,
                                       # then fail the match
|                                    # or, 
   (?<= [A-Z] )
   ( \d+ )                             # (1)
0 голосов
/ 06 января 2019

Вы можете использовать эту замену:

// Extract first word from text, as it must be excluded from the replacement
list($name, $def) = explode(" ", $text, 2);
// Make replacement in the rest
$result = $name . " " . preg_replace("/([A-Z][a-z]?)(\d+)/", "$1<sub>$2</sub>", $def);

Обратите внимание, что имена элементов могут заканчиваться строчными буквами, поэтому [a-z]?.

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

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