{"record":{"id":"5516a83fcf44595d","repo":"nats-io/nats-server","slug":"too-many-hyphens-s","errorCode":null,"errorMessage":"too many hyphens: %s","messagePattern":"too many hyphens: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/cron.go","lineNumber":198,"sourceCode":"\tif lowAndHigh[0] == \"*\" || lowAndHigh[0] == \"?\" {\n\t\tstart = r.min\n\t\tend = r.max\n\t\textra = starBit\n\t} else {\n\t\tstart, err = parseIntOrName(lowAndHigh[0], r.names)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tswitch len(lowAndHigh) {\n\t\tcase 1:\n\t\t\tend = start\n\t\tcase 2:\n\t\t\tend, err = parseIntOrName(lowAndHigh[1], r.names)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\tdefault:\n\t\t\treturn 0, fmt.Errorf(\"too many hyphens: %s\", expr)\n\t\t}\n\t}\n\n\tswitch len(rangeAndStep) {\n\tcase 1:\n\t\tstep = 1\n\tcase 2:\n\t\tstep, err = mustParseInt(rangeAndStep[1])\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\t// Special handling: \"N/step\" means \"N-max/step\".\n\t\tif singleDigit {\n\t\t\tend = r.max\n\t\t}\n\t\tif step > 1 {\n\t\t\textra = 0\n\t\t}","sourceCodeStart":180,"sourceCodeEnd":216,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/cron.go#L180-L216","documentation":"getRange splits a cron field on '/' for steps and '-' for ranges; a range part containing more than two hyphen-separated endpoints is rejected. Only a single 'low-high' range is supported per expression segment.","triggerScenarios":"A cron field segment containing multiple '-' ranges, e.g. hours field \"1-3-5\" or \"1-2-4-6\", passed while parsing the schedule via getField/getRange.","commonSituations":"Hand-writing cron with concatenated ranges instead of comma-separated ones; accidentally repeating a range separator.","solutions":["Express multiple ranges as a comma list: \"1-3,5-7\"","Use only one hyphen per segment: \"1-5\"","Use '*' with a step if uniform coverage is intended: \"*/2\""],"exampleFix":"// before\n expr := \"1-3-5\"\n// after\n expr := \"1-3,5\"","handlingStrategy":"validation","validationCode":"for _, seg := range strings.Fields(pattern) {\n    low := strings.SplitN(strings.SplitN(seg, \"/\", 2)[0], \"-\", 2)\n    for _, part := range low {\n        if strings.Count(part, \"-\") > 1 {\n            return fmt.Errorf(\"too many hyphens in %q\", part)\n        }\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["One hyphen per segment; join multiple ranges with commas","Lint cron strings before storing them in config"],"tags":["cron","parsing"],"backgroundTag":"invalid-cron-expression","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}