Похоже, у вас есть пара вещей, которые вы хотите исправить.Проблема с разделением слова на разные токены достаточно проста, если я понимаю, что вы подразумеваете под этим: просто используйте группы без захвата.Используйте (?:foo)
, если вы не хотите создавать новую группу захвата вокруг foo
;используйте (foo)
, если вы это сделаете.
В любом случае, ваш желаемый шаблон звучит для меня так:
p{L}*(?:\d*\.)?\d+(?:[eE][-+]?\d+)?(?:(?<=p{L}(?:\d*\.)?\d+(?:[eE][-+]?\d+)?)p{L}+)?
Объяснение:
p{L}* #Zero or more letter characters (note that this is broader than [a-zA-Z], as it allows accent marks and so forth)
(?:\d*\.)?\d+ #Slightly simplified version of your number-matching pattern
(?:(?<=p{L}...)p{L}+)? #Optionally match trailing letters, but only if there are letters at the beginning
Надеюсь, я понялчто ты ищешь.Одна проблема - [eE]
;это внесет некоторую двусмысленность.Например, если вы получите строку типа A3E4D , означает ли E букву или показатель степени?У меня есть некоторые идеи по этому поводу, но это будет дольше и сложнее.Дайте мне знать, каковы правила, и я отредактирую, я просто не хочу, чтобы это сбивало с толку, пока я не буду уверен, что вы ищете.