我希望在任何字符出现之前从文本中获取“this”值。
例:
文字:
start[hello:"", world:"", dsdsd:"", this:"a", wqewq:"", this:"b"], fdsfds, this:"c"
预期:
a, b
PS:我经常尝试并且非常沮丧。
答案 0 :(得分:0)
提取任何非空的'这个' CREATE PROCEDURE #TypeOfvalue (@code nvarchar(max)) AS
BEGIN
DECLARE @result int
BEGIN TRY
EXEC(N'SET PARSEONLY ON;SET NOEXEC ON;'+@code+N';SET NOEXEC OFF;SET PARSEONLY OFF;')
PRINT(N'Statement')
SET @result = 1
END TRY
BEGIN CATCH
PRINT(N'CSV')
SET @result = 2
END CATCH
RETURN @result
END
GO
DECLARE @returnCode int
EXECUTE @returnCode = #TypeOfvalue @code = N'abc;'
SELECT @returnCode as returned -- 2 (CSV)
EXECUTE @returnCode = #TypeOfvalue @code = N'SELECT * FROM sys.all_objects'
SELECT @returnCode as returned
DROP PROCEDURE #TypeOfvalue -- 1 (SELECT)
之前的值,您可以使用
]
请参阅demo,您的值在第1组。
\bthis:"([^"]+)(?=[^\]]*])
子模式检查在由一个或多个符号组成的非引号\bthis:"
字符串之前是否有this:"
,并且([^"]+)
先行检查是否存在(?=[^]]*])
之前]
以外的一系列字符。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果你使用的是pcre正则表达式引擎(php,R)或perl,你可以使用这种模式:
this:"\K[^"]+(?=")|](*COMMIT)(*F)
此处使用 \K
和前瞻(?=")
来避免创建捕获组。 \K
删除整场比赛左边的所有内容。所以整个匹配只包含引号之间的内容。
如果模式稍后失败,则回溯控制动词(*COMMIT)
会强制整个匹配失败。由于(*F)
使模式失败,因此在达到]
时停止研究。