سؤال

هل دعم postgresql \b?

أنا أحاول \bAB\b لكنه لا يتطابق مع أي شيء ، في حين (\W|^)AB(\W|$) يفعل. هاتان التعبيرات 2 هي نفسها ، أليس كذلك؟

هل كانت مفيدة؟

المحلول

يستخدم PostgreSQL \m, \M, \y و \Y كحدود للكلمة:

\m   matches only at the beginning of a word
\M   matches only at the end of a word
\y   matches only at the beginning or end of a word
\Y   matches only at a point that is not the beginning or end of a word 

يرى يهرب قيود التعبير العادية في الدليل.

يوجد ايضا [[:<:]] و [[:>:]], ، والتي تتطابق مع بداية ونهاية كلمة. من عند الدليل:

هناك حالتان خاصتان من تعبيرات قوسين: تعبيرات القوس [[:<:]] و [[:>:]] هي قيود ، مطابقة السلاسل الفارغة في بداية ونهاية كلمة على التوالي. يتم تعريف الكلمة على أنها سلسلة من أحرف الكلمة التي لا تسبقها ولا تتبعها أحرف كلمة. كلمة كلمة هي حرف alnum (كما هو محدد بواسطة ctype) أو السفلية. هذا امتداد ، متوافق مع ولكن لم يحدده POSIX 1003.2 ، ويجب استخدامه بحذر في البرامج المهددة بأن تكون محمولة في أنظمة أخرى. عادةً ما تكون القيد الموضحة أدناه مفضلة (فهي لم تعد قياسية أكثر ، ولكن من المؤكد أنها أسهل في الكتابة).

نصائح أخرى

مثال بسيط

select * from table_name where column ~* '\yAB\y';

هذا سوف يتطابق AB ab ab - text text ab text AB text-ab-text text AB text ...

لكن عليك استخدام:

select * from sometable where name ~* '\\yAB\\y';

في حال كان لديك standard_conforming_strings تعيين العلم إلى OFF. لاحظ ال قطع مزدوجة.
يمكنك ضبطه يدويًا:

set standard_conforming_strings=on;

ثم :select * from table_name where column ~* '\yAB\y'; يجب أن تعمل.

البحث عن الكلمات الدقيقة في النص:

كنت أواجه مشكلة التالية.

كنت أرغب في البحث في جميع جهات الاتصال التي لها كلمة "CTO" ككلمة دقيقة في العناوين ، ولكن في النتائج كانت تحصل على نتائج مع وجود "مدير" ، كنت أستخدم الاستعلام التالي

select * from contacts where title ilike '%cto%';

لقد حاولت أيضًا مع Whitspaces حول Wildcard باسم "٪ CTO ٪" ، فقد تم مطابقة النص الذي يحتوي على "CTO" ، وحصلت على نتائج مثل "VP و CTO و MANGER" ، ولكن ليس النتائج بعنوان دقيق مثل "CTO".

أردت كل من "VP و CTO و Manger" و "CTO" في النتائج ، ولكن ليس "مدير" في النتائج

بعد ذلك عملت بالنسبة لي

select * from contacts where title ~* '\\ycto\\y';

~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top