SQL Server에서 RegEx 사용
아래의 RegEx 설정/파라미터에 따라 RegEx를 사용하여 텍스트를 대체/인코딩하는 방법을 찾고 있습니다.
RegEx.IgnoreCase = True
RegEx.Global = True
RegEx.Pattern = "[^a-z\d\s.]+"
RegEx에서 몇 가지 예를 보았지만 SQL Server에서 동일하게 적용하는 방법이 헷갈렸습니다.어떤 제안이든 도움이 될 것입니다.감사해요.
LIKE를 사용할 수 있으므로 관리되는 코드와 상호 작용할 필요가 없습니다.
CREATE TABLE #Sample(Field varchar(50), Result varchar(50))
GO
INSERT INTO #Sample (Field, Result) VALUES ('ABC123 ', 'Do not match')
INSERT INTO #Sample (Field, Result) VALUES ('ABC123.', 'Do not match')
INSERT INTO #Sample (Field, Result) VALUES ('ABC123&', 'Match')
SELECT * FROM #Sample WHERE Field LIKE '%[^a-z0-9 .]%'
GO
DROP TABLE #Sample
당신의 표현이 끝나는 대로.+가셔도 됩니다'%[^a-z0-9 .][^a-z0-9 .]%'
편집:
SQL Server는 관리 코드가 없는 정규식을 지원하지 않습니다.상황에 따라서,LIKE연산자는 옵션이 될 수 있지만 정규식에서 제공하는 유연성이 부족합니다.
정규식 - 설명
하나의 문자와 일치
임의의 문자와 일치
이전 식의 하나 이상의 인스턴스와 일치
줄의 시작 부분에서 시작
줄 끝에서 검색
< 단어가 이 지점에서 시작하는 경우에만 일치
> 단어가 이 지점에서 멈추는 경우에만 일치합니다.
\n 줄 바꿈 일치
[] 대괄호 안에 있는 모든 문자와 일치
[^...] ^ 뒤에 나열되지 않은 문자와 일치합니다.
[ABQ]% 문자열은 A, B 또는 Q 문자로 시작해야 하며 임의의 길이일 수 있습니다.
[AB][CD]% 문자열의 길이는 두 개 이상이어야 하며 A 또는 B로 시작하고 C 또는 D가 두 번째 문자여야 합니다.
[A-Z]% 문자열은 임의의 길이일 수 있으며 A에서 Z 사이의 문자로 시작해야 합니다.
[A-Z0-9]%문자열은 임의의 길이일 수 있으며 A에서 Z 사이의 문자 또는 0에서 9 사이의 숫자로 시작해야 합니다.
[^A-C]% 문자열은 임의의 길이일 수 있지만 A에서 C 사이의 문자로 시작할 수 없습니다.
%[A-Z] 문자열은 임의의 길이일 수 있으며 A에서 Z 사이의 문자로 끝나야 합니다.
%[%$#@]% 문자열은 임의의 길이일 수 있으며 괄호 안에 포함된 특수 문자 중 하나 이상을 포함해야 합니다.
이 문서에서 설명하는 것처럼 정규식 기능을 제공하는 CLR 절차를 구축해야 합니다.
예제 함수는 VB를 사용합니다.NET:
Imports System
Imports System.Data.Sql
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.Runtime.InteropServices
Imports System.Text.RegularExpressions
Imports System.Collections 'the IEnumerable interface is here
Namespace SimpleTalk.Phil.Factor
Public Class RegularExpressionFunctions
'RegExIsMatch function
<SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
Public Shared Function RegExIsMatch( _
ByVal pattern As SqlString, _
ByVal input As SqlString, _
ByVal Options As SqlInt32) As SqlBoolean
If (input.IsNull OrElse pattern.IsNull) Then
Return SqlBoolean.False
End If
Dim RegExOption As New System.Text.RegularExpressions.RegExOptions
RegExOption = Options
Return RegEx.IsMatch(input.Value, pattern.Value, RegExOption)
End Function
End Class '
End Namespace
...다음 SQL을 사용하여 SQL Server에 설치됩니다('%'로 구분된 변수를 실제 등가물로 대체).
sp_configure 'clr enabled', 1
RECONFIGURE WITH OVERRIDE
IF EXISTS ( SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'dbo.RegExIsMatch') )
DROP FUNCTION dbo.RegExIsMatch
go
IF EXISTS ( SELECT 1
FROM sys.assemblies asms
WHERE asms.name = N'RegExFunction ' )
DROP ASSEMBLY [RegExFunction]
CREATE ASSEMBLY RegExFunction
FROM '%FILE%'
GO
CREATE FUNCTION RegExIsMatch
(
@Pattern NVARCHAR(4000),
@Input NVARCHAR(MAX),
@Options int
)
RETURNS BIT
AS EXTERNAL NAME
RegExFunction.[SimpleTalk.Phil.Factor.RegularExpressionFunctions].RegExIsMatch
GO
--a few tests
---Is this card a valid credit card?
SELECT dbo.RegExIsMatch ('^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$','4241825283987487',1)
--is there a number in this string
SELECT dbo.RegExIsMatch( '\d','there is 1 thing I hate',1)
--Verifies number Returns 1
DECLARE @pattern VARCHAR(255)
SELECT @pattern ='[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]'
SELECT dbo.RegExIsMatch (@pattern, '1298-673-4192',1),
dbo.RegExIsMatch (@pattern,'A08Z-931-468A',1),
dbo.RegExIsMatch (@pattern,'[A90-123-129X',1),
dbo.RegExIsMatch (@pattern,'12345-KKA-1230',1),
dbo.RegExIsMatch (@pattern,'0919-2893-1256',1)
훌리오의 답변을 약간 수정한 버전입니다.
-- MS SQL using VBScript Regex
-- select dbo.RegexReplace('aa bb cc','($1) ($2) ($3)','([^\s]*)\s*([^\s]*)\s*([^\s]*)')
-- $$ dollar sign, $1 - $9 back references, $& whole match
CREATE FUNCTION [dbo].[RegexReplace]
( -- these match exactly the parameters of RegExp
@searchstring varchar(4000),
@replacestring varchar(4000),
@pattern varchar(4000)
)
RETURNS varchar(4000)
AS
BEGIN
declare @objRegexExp int,
@objErrorObj int,
@strErrorMessage varchar(255),
@res int,
@result varchar(4000)
if( @searchstring is null or len(ltrim(rtrim(@searchstring))) = 0) return null
set @result=''
exec @res=sp_OACreate 'VBScript.RegExp', @objRegexExp out
if( @res <> 0) return '..VBScript did not initialize'
exec @res=sp_OASetProperty @objRegexExp, 'Pattern', @pattern
if( @res <> 0) return '..Pattern property set failed'
exec @res=sp_OASetProperty @objRegexExp, 'IgnoreCase', 0
if( @res <> 0) return '..IgnoreCase option failed'
exec @res=sp_OAMethod @objRegexExp, 'Replace', @result OUT,
@searchstring, @replacestring
if( @res <> 0) return '..Bad search string'
exec @res=sp_OADestroy @objRegexExp
return @result
END
SQL에서 Ole Automation Procedures를 설정해야 합니다.
exec sp_configure 'show advanced options',1;
go
reconfigure;
go
sp_configure 'Ole Automation Procedures', 1;
go
reconfigure;
go
sp_configure 'show advanced options',0;
go
reconfigure;
go
SELECT * from SOME_TABLE where NAME like '%[^A-Z]%'
아니면 A-Z 대신 다른 표현.
@mwigdahl의 답변과 유사한 접근 방식으로 a를 구현할 수도 있습니다.C#의 NET CLR(다음과 같은 코드 포함):
using System.Data.SqlTypes;
using RX = System.Text.RegularExpressions;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString Regex(string input, string regex)
{
var match = RX.Regex.Match(input, regex).Groups[1].Value;
return new SqlString (match);
}
}
설치 지침은 여기에서 확인할 수 있습니다.
언급URL : https://stackoverflow.com/questions/8928378/using-regex-in-sql-server
'programing' 카테고리의 다른 글
| 맥OS에서 Git를 최신 버전으로 업그레이드하는 방법은 무엇입니까? (0) | 2023.05.09 |
|---|---|
| 각 하위구에 제목을 추가하는 방법 (0) | 2023.05.09 |
| AADSTS9002325: 코드 교환을 위한 인증 키는 교차 오리진 인증 코드를 상환하는 데 필요합니다. (0) | 2023.05.09 |
| 도커 실행을 통해 셸 스크립트에 인수를 전달하는 방법 (0) | 2023.05.09 |
| VB의 여러 줄에 걸친 단일 문입니다.밑줄 문자가 없는 NET (0) | 2023.05.09 |