एक शब्द के साथ एक स्ट्रिंग के लिए नियमित अभिव्यक्ति लेकिन एक और नहीं


103

मैं Google Analytics में कुछ लक्ष्य निर्धारित कर रहा हूं और थोड़ी रेगेक्स मदद का उपयोग कर सकता हूं।

कहते हैं कि मेरे पास 4 URL हैं

http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1

मैं एक अभिव्यक्ति बनाना चाहता हूं जो किसी भी URL की पहचान करेगा जिसमें स्ट्रिंग चयनकर्ता = आकार शामिल है लेकिन इसमें विवरण नहीं है। cfm

मुझे पता है कि एक स्ट्रिंग को खोजने के लिए जिसमें एक और स्ट्रिंग नहीं है मैं इस अभिव्यक्ति का उपयोग कर सकता हूं:

(^((?!details.cfm).)*$)

लेकिन, मुझे यकीन नहीं है कि चयनकर्ता = आकार भाग में कैसे जोड़ा जाए ।

किसी भी तरह की सहायता का स्वागत किया जाएगा!

जवाबों:


144

यह करना चाहिए:

^(?!.*details\.cfm).*selector=size.*$

^.*selector=size.*$पर्याप्त स्पष्ट होना चाहिए। पहला बिट, (?!.*details.cfm)एक नकारात्मक लुक-फॉरवर्ड है: स्ट्रिंग के मिलान से पहले यह जांचता है कि स्ट्रिंग में "details.cfm" नहीं है (इसके पहले किसी भी वर्ण के साथ)।


8
FYI करें, इन भावों का परीक्षण करने के लिए एक अच्छे तरीके के लिए regexr.com देखें
जोशुआ पिंटर

हमेशा नकारात्मक लुकहेड के बारे में भूल जाते हैं और यह बहुत उपयोगी है
एलेक्सी ब्लू

"http://www.anydotcom.com/test/search.cfm?metric=blah&selector=sized&value=1" =~ /^(?!.*details\.cfm).*selector=size.*$/ #=> 0गलत है। (नोट में स्ट्रिंग शामिल है "...selector=sized..."।) इसके अलावा, .*$अंत में क्यों ?
कैरी स्वेवेलैंड

4

रेगेक्स हो सकता है (पर्ल सिंटैक्स):

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`

यह एक दूषित रेगेक्स है, वर्ग ब्रैकेट सभी पैटर्न अनुक्रमों को व्यक्तिगत वर्णों के संयोजन में बदल देते हैं।
विकटोरिया स्ट्राइब्यूव

2
^(?=.*selector=size)(?:(?!details\.cfm).)+$

यदि आपका रेगेक्स इंजन पॉज़ेसिव क्वांटिफायर का समर्थन करता है (हालांकि मुझे संदेह है कि Google Analytics नहीं करता है), तो मुझे लगता है कि यह आपके इनपुट सेट के लिए बेहतर प्रदर्शन करेगा:

^[^?]*+(?<!details\.cfm).*?selector=size.*$

यह selector=sizeमाना जाता है कि यह हमेशा पहले होता है details.cfm, जो पिछले url में ऐसा नहीं है।
कोबी

बस इसे साफ करने के लिए, यह मैं नहीं था। मैं यह नहीं देख सकता कि कोई व्यक्ति यहां दो उत्तरों को वोट क्यों देगा, वे दोनों सही हैं।
कोबी

@ कोबी: यह लुक-फॉरवर्ड, सही होना चाहिए था। ओह और वैसे, मुझे संदेह नहीं था कि यह आपका डाउन-वोट था।
तोमलक

0

मैं --line-bufferedऐसी ही स्थिति में एक पूंछ पर बचने के लिए एक रास्ता तलाश रहा था क्योंकि ओपी और कोबी का समाधान मेरे लिए बहुत अच्छा काम करता है। मेरे मामले में ' / '(मेरे मूल दस्तावेज़ के लिए) जबकि "बॉट" या "स्पाइडर" के साथ लाइनों को छोड़कर ।

मेरा मूल आदेश:

tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '

अब बन जाता है ( -Pपर्ल स्विच के साथ ):

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.