SQL सर्वर में RegEx का उपयोग करना


92

मैं देख रहा हूँ कि कैसे RegEx सेटिंग्स / नीचे params पर आधारित RegEx का उपयोग करके पाठ को बदलना / एनकोड करना है:

RegEx.IgnoreCase = True     
RegEx.Global = True     
RegEx.Pattern = "[^a-z\d\s.]+"   

मैंने RegEx पर कुछ उदाहरण देखे हैं, लेकिन उलझन में है कि इसे SQL सर्वर में कैसे लागू किया जाए। कोई भी सुझाव महत्वपूर्ण है। धन्यवाद।


1
हाय इस लेख पर एक नज़र डालें: codeproject.com/Articles/42764/…
मोहसिन

रोबिन पेज और फिल फैक्टर में एक बढ़िया TSQL + Windows API सॉल्यूशन भी है जो VBScript पर निर्भर करता है ।egExp क्लास, जो, मैं विश्वास करता हूं, विंडोज 2000 के बाद से हर विंडोज वर्जन पर शिप किया जाता है।
जूलियो नोब्रे

यदि आपको TSQL के माध्यम से पूरी तरह से RegEx की आवश्यकता है, तो SQL सर्वर 2016 और इसके बाद के संस्करण का एक विकल्प आर सेवाओं का उपयोग करना है
डेव मेसन

जवाबों:


103

आपको प्रबंधित कोड के साथ सहभागिता करने की आवश्यकता नहीं है, क्योंकि आप 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 सर्वर प्रबंधित कोड के बिना नियमित अभिव्यक्ति का समर्थन नहीं करता है। स्थिति के आधार पर, LIKEऑपरेटर एक विकल्प हो सकता है, लेकिन इसमें लचीलेपन की कमी होती है जो नियमित अभिव्यक्ति प्रदान करता है।


8
@ मायकेयुंग, आप सही कह रहे हैं। यह उत्तर गलत तरीके से +क्वांटिफायर को संबोधित करता है {1,2}जब उसे इसे लेना चाहिए {1, }। आश्चर्यजनक रूप से, इसने ओपी के लिए काम किया।
रबेंस फरियास

2
यह sql सर्वर में काम नहीं करेगा क्योंकि यह रेगेक्स का समर्थन नहीं करता है।
वीवीएन

10
@ वीवीएन, LIKEरेगेक्स नहीं है (यह एक अधिक सीमित पैटर्न-मिलान वाक्यविन्यास है), इसलिए रेगेक्स समर्थन की कमी का मतलब यह नहीं है कि यह काम नहीं करेगा।
चार्ल्स डफी

@ माइक-यंग से टिप्पणियों के प्रकाश में उत्तर को अपडेट करना अच्छा नहीं होगा?
सुधांशु मिश्रा

8

जूलियो के जवाब का थोड़ा संशोधित संस्करण

-- 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 स्वचालन प्रक्रिया की आवश्यकता होगी:

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

2
BTW, यह रेगेक्स ऑब्जेक्ट को कैश करने और पुन: उपयोग करने के लिए नष्ट करने और पुनः बनाने के लिए बहुत तेज़ है। हमने ऑब्जेक्ट का पुन: उपयोग करते हुए महत्वपूर्ण संख्या के साथ 10,000 तुलना की।
ज़ाचरी स्कॉट

8

आपको एक CLR प्रक्रिया बनानी होगी जो regex कार्यक्षमता प्रदान करती है, क्योंकि यह लेख दिखाता है।

उनका उदाहरण फ़ंक्शन 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 ('%' की जगह) का उपयोग करके स्थापित किया गया है - उनके वास्तविक समकक्षों द्वारा परिसीमित चर:

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)

यह क्लासिक एएसपी में है, क्या यह समर्थन करता है? मुझे लगता है कि CLR केवल .NET फ़ंक्शन के लिए है, है ना?
कंट्रोल फ्रीक

4
सीएलआर प्रक्रियाओं को SQL सर्वर वातावरण में स्थापित किया जाता है और इसे किसी भी अन्य संग्रहीत प्रक्रिया या उपयोगकर्ता-परिभाषित फ़ंक्शन की तरह लगाया जा सकता है, इसलिए यदि क्लासिक एएसपी एक संग्रहीत प्रक्रिया या उपयोगकर्ता-परिभाषित फ़ंक्शन को लागू कर सकता है, तो यह सीएलआर प्रक्रिया को लागू कर सकता है।
mwigdahl

1
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक हिस्सों को यहां शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - रिव्यू से
फेडेरिको क्लेज़ कुल्लोका

धन्यवाद @FedericoklezCulloca यह एक पुराना उत्तर था और मैंने उसी के अनुसार इसे अद्यतन किया है।
mwigdahl

@mwigdahl इसके लिए धन्यवाद। मैं देख रहा हूं कि यह पुराना है, लेकिन यह एक समीक्षा कतार में पॉप अप किया गया है :)
फेडेरिको क्लेज़ कुल्लोका

8

SQL सर्वर डेटाबेस कार्यान्वयन में नियमित अभिव्यक्तियाँ उपयोग करें

नियमित अभिव्यक्ति - विवरण
किसी भी एक वर्ण से
मेल करें * किसी भी वर्ण से मेल खाएं
+ अभिव्यक्ति के कम से कम एक उदाहरण से पहले मिलान करें
^ पंक्ति की शुरुआत
$ $ लाइन के अंत में खोजें
< मिलान केवल इस बिंदु पर शब्द शुरू होने पर ही करें
> शब्द केवल इस बिंदु पर रुकता है
\ n एक पंक्ति विराम का मिलान करें
[] कोष्ठक के भीतर किसी भी वर्ण का मिलान करें
[^ ...] ^
[ABQ]% के बाद सूचीबद्ध नहीं किए गए किसी भी वर्ण से मेल खाता है , स्ट्रिंग को अक्षर A, B, या Q से शुरू होना चाहिए और किसी भी लम्बाई का हो सकता है
[ऐ बी सी डी]% स्ट्रिंग की लंबाई दो या अधिक होनी चाहिए और जो A या B से शुरू होनी चाहिए और C या D से दूसरे वर्ण के रूप में होना चाहिए
[AZ]% यह स्ट्रिंग किसी भी लम्बाई का हो सकता है और इसे A से Z
[A] किसी भी अक्षर से शुरू करना चाहिए -Z0-9]% स्ट्रिंग किसी भी लम्बाई का हो सकता है और इसे A से Z तक के किसी भी अक्षर से शुरू करना चाहिए या 0 से 9 तक का अंक होना चाहिए
[^ AC]% स्ट्रिंग किसी भी लम्बाई का हो सकता है लेकिन A से C के अक्षर से शुरू नहीं हो सकता है
% [AZ] स्ट्रिंग किसी भी लम्बाई की हो सकती है और उसे A से Z तक के किसी भी अक्षर के साथ समाप्त होना चाहिए
[% $ # @ @] स्ट्रिंग किसी भी लम्बाई की हो सकती है और उसमें संलग्न विशेष वर्णों में से कम से कम एक होना चाहिए। ब्रैकेट



1

@ Mwigdahl के उत्तर के समान दृष्टिकोण, आप 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);
 }
}

स्थापना निर्देश यहां देखे जा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.