Это более чем немного поздно, но вы также можете расширить выражение регулярного выражения для учета научной нотации.
import re
# Format is [(, ), ...]
ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3",
['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3']),
('hello X42 I\'m a Y-32.35 string Z30',
['42', '-32.35', '30']),
('he33llo 42 I\'m a 32 string -30',
['33', '42', '32', '-30']),
('h3110 23 cat 444.4 rabbit 11 2 dog',
['3110', '23', '444.4', '11', '2']),
('hello 12 hi 89',
['12', '89']),
('4',
['4']),
('I like 74,600 commas not,500',
['74,600', '500']),
('I like bad math 1+2=.001',
['1', '+2', '.001'])]
for s, r in ss:
rr = re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", s)
if rr == r:
print('GOOD')
else:
print('WRONG', rr, 'should be', r)
Дает все хорошее!
Кроме того, вы можете посмотрите на встроенное регулярное выражение AWS Glue
Я думаю, проблема в том, что вы даете вашей карте тип: Map<string, string>
. Это вызвано тем, как вы создали свою карту: new Map(<[string, string][]> ...)
.
Это вызывает ошибку, которую вы получаете: Type 'string' is not assignable to type '"Editor" | "Console" | "Settings" | "Outputs"'
В следующем фрагменте вы пытаетесь использовать значение этой Карты, вызвав метод get
с ключом. Это, однако, возвращает строку (поскольку тип вашей карты был определен как имеющий значения строки типа.
this.selectTab(TabIndex[this.tabs.get(tabParam)!]);
Оператор TabIndex[xxxx]
, однако, ожидает, что 'xxxx' является одним из следующих значений "Editor" | "Console" | "Settings" | "Outputs"
, поскольку вы можете вычесть из сообщения об ошибке выше.
Чтобы исправить это, вам нужно изменить тип своей Карты, чтобы машинописный текст знал, что «xxxx» в фрагмент выше всегда будет одним из этих значений. Для этого вам нужно создать «типы объединения этих конкретных строковых литералов». К счастью, машинопись позволяет нам извлечь из определения TabIndex
.
keyof typeof TabIndex
Это разрешит «тип объединения строковых литералов», необходимый для правильного ввода Карты.
Итак, чтобы подвести итог, измените создание на карте:
const tabs = new Map(<[string, keyof typeof TabIndex][]>Object.keys(TabIndex).map((key: any) => [TabIndex[key], key]));
Это будет гарантировать, что значения из Карты, которые могут быть переданы в TabIndex [xxxx], всегда будут известным строковым литералом.
Проблема заключается в том, что в строке, определяющей typeParam
, вы назначаете string
(queryParam.tab
- это строка, которую я себе представляю? Либо это, либо any
), к keyof typeof TabIndex
. string
может содержать любое строковое значение, поэтому его нельзя присваивать переменной, которая принимает только четыре конкретных значения.
Но если вы уверены, что tab
всегда будет тем, что вы ожидаете от вас может сделать утверждение:
type TabIndexKey = keyof typeof TabIndex;
const tabParam: TabIndexKey = this.urlSerializer.parse(this.location.path()).queryParams.tab as TabIndexKey.
Если queryParams.tab
равно any
, решение будет тем же самым.
EDIT: Чтобы избежать ошибки с неявным, индексы для перечислений должны использовать числа, а не строки. Это означает, что:
TabIndex['editor']; // error with not implicit any
TabIndex[0]; // correct
Итак, я рекомендую вам изменить определение вашего перечисления и карту tabs
. Вместо назначения строк присвойте числа:
export enum TabIndex {
Editor = 0,
Console = 1,
Settings = 2,
Outputs = 3
}
const tabs = new Map(<[string, number][]>Object.keys(TabIndex).map((key: any) => [key, TabIndex[key]]));
Конечно, делая это, мы немного лежим, потому что tabs
на самом деле не является <string, number>
. На самом деле он имеет как строки, так и числа. Цифровые клавиши указывают на имена свойств, а строковые ключи указывают на их числовые эквиваленты. Однако, мы можем забыть об этом, поскольку вы собираетесь использовать только строковые ключи.
Теперь TabIndex[this.tabs.get(tabParam)!]
работает правильно, так как this.tabs.get
возвращает number
.
Надеюсь, это вам поможет.