diff --git a/Sources/RegexBuilder/DSL.swift b/Sources/RegexBuilder/DSL.swift index 10590fb74..e8dffaa8e 100644 --- a/Sources/RegexBuilder/DSL.swift +++ b/Sources/RegexBuilder/DSL.swift @@ -127,6 +127,19 @@ extension DSLTree.Node { } } +/// A regex component that matches exactly one occurrence of its underlying +/// component. +@available(SwiftStdlib 5.7, *) +public struct One: RegexComponent { + public var regex: Regex + + public init( + _ component: Component + ) where Component.RegexOutput == Output { + self.regex = component.regex + } +} + @available(SwiftStdlib 5.7, *) public struct OneOrMore: _BuiltinRegexComponent { public var regex: Regex diff --git a/Tests/RegexBuilderTests/RegexDSLTests.swift b/Tests/RegexBuilderTests/RegexDSLTests.swift index c0c6491ac..f325b579f 100644 --- a/Tests/RegexBuilderTests/RegexDSLTests.swift +++ b/Tests/RegexBuilderTests/RegexDSLTests.swift @@ -66,7 +66,7 @@ class RegexDSLTests: XCTestCase { ("a c", ("a c", " ", "c")), matchType: (Substring, Substring, Substring).self, ==) { - .any + One(.any) Capture(.whitespace) // Substring Capture("c") // Substring } @@ -344,7 +344,7 @@ class RegexDSLTests: XCTestCase { matchType: (Substring, Substring).self, ==) { OneOrMore(.reluctant) { - .word + One(.word) }.repetitionBehavior(.possessive) Capture(.digit) ZeroOrMore(.any) @@ -615,13 +615,13 @@ class RegexDSLTests: XCTestCase { func testUnicodeScalarPostProcessing() throws { let spaces = Regex { ZeroOrMore { - .whitespace + One(.whitespace) } } let unicodeScalar = Regex { OneOrMore { - .hexDigit + One(.hexDigit) } spaces } @@ -637,14 +637,10 @@ class RegexDSLTests: XCTestCase { spaces Capture { - OneOrMore { - .word - } + OneOrMore(.word) } - ZeroOrMore { - .any - } + ZeroOrMore(.any) } // Assert the inferred capture type. @@ -841,7 +837,7 @@ class RegexDSLTests: XCTestCase { let a = Reference(Substring.self) ChoiceOf<(Substring, Substring?)> { Regex { - .word + One(.word) a } Regex { @@ -890,7 +886,7 @@ class RegexDSLTests: XCTestCase { let a = Reference(Substring.self) ChoiceOf<(Substring, Substring?)> { Regex { - .word + One(.word) a } Regex {