ਜ਼ਿਆਦਾਤਰ ਪ੍ਰੋਗਰਾਮਰਾਂ ਦੀ ਇੱਕ ਕਮਜ਼ੋਰੀ ਹੁੰਦੀ ਹੈ। ਉਹ ਖੁਸ਼ੀ-ਖੁਸ਼ੀ ਇੱਕ ਡਿਸਟ੍ਰੀਬਿਊਟਿਡ ਸਿਸਟਮ ਨੂੰ ਡੀਬੱਗ ਕਰਨਗੇ ਜਾਂ ਕਿਸੇ ਨਵੇਂ ਫਰੇਮਵਰਕ ਨਾਲ ਜੂਝਣਗੇ, ਫਿਰ ਵੀ ਉਹ ਇੱਕ ਅਜਿਹਾ ਮੈਨੂਅਲ ਟੈਕਸਟ ਐਡਿਟ ਕਰਨ ਵਿੱਚ ਵੀਹ ਮਿੰਟ ਬਰਬਾਦ ਕਰ ਦੇਣਗੇ ਜਿਸ ਵਿੱਚ ਸਿਰਫ਼ ਦਸ ਸੈਕਿੰਡ ਲੱਗਣੇ ਚਾਹੀਦੇ ਹਨ। ਇਸਦਾ ਕਾਰਨ ਹਮੇਸ਼ਾ ਇੱਕੋ ਹੁੰਦਾ ਹੈ: ਰੈਗੂਲਰ ਐਕਸਪ੍ਰੈਸ਼ਨ (regex) ਲਾਈਨ ਨੋਇਜ਼ (line noise) ਵਾਂਗ ਦਿਖਾਈ ਦਿੰਦੇ ਹਨ। ਇੱਕ ਆਮ ਪੈਟਰਨ ਸਲੈਸ਼ਾਂ, ਬੈਕਸਲੈਸ਼ਾਂ ਅਤੇ ਵਿਰਾਮ ਚਿੰਨ੍ਹਾਂ ਦੀ ਇੱਕ ਅਜਿਹੀ ਕੰਧ ਵਾਂਗ ਹੁੰਦਾ ਹੈ ਜੋ ਲੱਗਦਾ ਹੈ ਕਿ 1990 ਦੇ ਦਹਾਕੇ ਦੇ ਮੋਡਮ ਤੋਂ ਆਇਆ ਹੋਵੇ। ਉਹ ਵਿਜ਼ੂਅਲ ਹਫੜਾ-ਦਫੜੀ ਸਮਰੱਥ ਲੋਕਾਂ ਨੂੰ ਇੱਕ ਅਸਲ ਕੀਮਤੀ ਹੁਨਰ ਤੋਂ ਦੂਰ ਭਜਾ ਦਿੰਦੀ ਹੈ।

ਚੰਗੀ ਖ਼ਬਰ ਇਹ ਹੈ ਕਿ regex ਮੁਸ਼ਕਲ ਨਹੀਂ ਹੈ। ਇਹ ਸੰਘਣਾ (dense) ਹੈ। ਚਿੰਨ੍ਹ ਇੱਕ ਛੋਟੀ ਜਿਹੀ ਜਗ੍ਹਾ ਵਿੱਚ ਬਹੁਤ ਜ਼ਿਆਦਾ ਅਰਥ ਭਰ ਦਿੰਦੇ ਹਨ, ਇਸ ਲਈ ਤੁਹਾਡੀ ਅੱਖ ਉੱਥੇ ਅਨਿਯਮਿਤਤਾ ਪੜ੍ਹਦੀ ਹੈ ਜਿੱਥੇ ਅਸਲ ਵਿੱਚ ਇੱਕ ਬਹੁਤ ਹੀ ਸਹੀ ਵੇਰਵਾ ਹੁੰਦਾ ਹੈ। ਇੱਕ ਵਾਰ ਜਦੋਂ ਤੁਹਾਡੇ ਕੋਲ ਸਹੀ ਮਾਨਸਿਕ ਮਾਡਲ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਚਿੰਨ੍ਹਾਂ ਨੂੰ ਇੱਕ-ਇੱਕ ਕਰਕੇ ਡੀਕੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨਾ ਬੰਦ ਕਰ ਦਿੰਦੇ ਹੋ ਅਤੇ ਇਸ ਦੀ ਬਜਾਏ ਉਸ ਆਕਾਰ ਨੂੰ ਪੜ੍ਹਦੇ ਹੋ ਜਿਸਦਾ ਉਹ ਵਰਣਨ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਹ ਹਫੜਾ-ਦਫੜੀ ਪੂਰੀ ਤਰ੍ਹਾਂ ਖਤਮ ਹੋ ਜਾਂਦੀ ਹੈ।

ਇੱਕ ਪੈਟਰਨ, ਪ੍ਰੋਗਰਾਮ ਨਹੀਂ

ਮੂਲ ਤਬਦੀਲੀ ਇਹ ਸਮਝਣ ਵਿੱਚ ਹੈ ਕਿ ਰੈਗੂਲਰ ਐਕਸਪ੍ਰੈਸ਼ਨ ਅਸਲ ਵਿੱਚ ਕੀ ਹੈ। ਤੁਹਾਡਾ ਲਿਖਿਆ ਹੋਇਆ ਜ਼ਿਆਦਾਤਰ ਕੋਡ ਪ੍ਰੋਸੀਜਰਲ (procedural) ਹੁੰਦਾ ਹੈ: ਇਹ ਕਰੋ, ਫਿਰ ਉਹ ਕਰੋ, ਇਹ ਸ਼ਰਤ ਚੈੱਕ ਕਰੋ, ਦੁਬਾਰਾ ਲੂਪ ਕਰੋ। ਇੱਕ regex ਕੋਈ ਪ੍ਰੋਸੀਜਰ ਨਹੀਂ ਹੈ। ਇਹ ਇੱਕ ਸਥਿਰ ਪੈਟਰਨ ਹੈ ਜੋ ਦੱਸਦਾ ਹੈ ਕਿ ਟੈਕਸਟ ਕਿਹੋ ਜਿਹਾ ਦਿਖਣਾ ਚਾਹੀਦਾ ਹੈ। ਤੁਸੀਂ ਖੋਜ ਕਰਨ ਦੇ ਤਰੀਕੇ ਲਈ ਹਦਾਇਤਾਂ ਨਹੀਂ ਲਿਖ ਰਹੇ ਹੋ; ਤੁਸੀਂ ਮੈਚਿੰਗ ਇੰਜਣ ਨੂੰ ਇੱਕ ਸਕੈਚ (sketch) ਦੇ ਰਹੇ ਹੋ ਅਤੇ ਉਸਨੂੰ ਕੰਮ ਕਰਨ ਦੇ ਰਹੇ ਹੋ।

ਇਸਨੂੰ ਸਧਾਰਨ ਅੰਗਰੇਜ਼ੀ ਵਿੱਚ ਆਕਾਰਾਂ ਦੇ ਵਰਣਨ ਵਜੋਂ ਸਮਝੋ:

  • ਇੱਕ ਪੰਜ-ਅੰਕਾਂ ਵਾਲੀ ਸੰਖਿਆ।
  • ਇੱਕ ਈਮੇਲ ਪਤਾ।
  • ਇੱਕ ਲਾਈਨ ਜੋ ਵੱਡੇ ਅੱਖਰ (capital letter) ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ।

regex ਸਿਰਫ਼ ਇਹੀ ਕਰ ਰਿਹਾ ਹੈ, ਸਿਵਾਏ ਇਸ ਦੇ ਕਿ ਇਹ ਇੱਕ ਸੰਕੁਚਿਤ ਅਲਫਾਬੇਟ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ \d{5} ਦੇਖਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਕੋਈ ਜਾਦੂ ਨਹੀਂ ਦੇਖ ਰਹੇ ਹੁੰਦੇ। ਤੁਸੀਂ "ਇੱਕ ਅੰਕ, ਪੰਜ ਵਾਰ" ਦੇਖ ਰਹੇ ਹੁੰਦੇ ਹੋ। ਜਦੋਂ ਤੁਸੀਂ ^[A-Z] ਦੇਖਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ "ਲਾਈਨ ਦੀ ਸ਼ੁਰੂਆਤ, ਜਿਸ ਤੋਂ ਬਾਅਦ ਇੱਕ ਵੱਡਾ ਅੱਖਰ ਆਵੇ" ਦੇਖ ਰਹੇ ਹੁੰਦੇ ਹੋ। ਇਹ ਹੁਨਰ ਯਾਦ ਰੱਖਣਾ ਨਹੀਂ ਹੈ। ਇਹ ਪੈਟਰਨ 'ਤੇ ਇੱਕ ਨਜ਼ਰ ਮਾਰਨਾ ਅਤੇ ਉਸਨੂੰ ਦੁਬਾਰਾ ਉਸ ਸਾਧਾਰਨ ਅੰਗਰੇਜ਼ੀ ਵਰਣਨ ਵਿੱਚ ਬਦਲਣਾ ਸਿੱਖਣਾ ਹੈ। ਇੱਕ ਵਾਰ ਜਦੋਂ ਤੁਸੀਂ ਉਹ ਅਨੁਵਾਦ ਕਰ ਸਕਦੇ ਹੋ, ਤਾਂ ਡਰ ਦਾ ਕਾਰਕ ਖਤਮ ਹੋ ਜਾਂਦਾ ਹੈ।

ਸਮਾਂ ਅਸਲ ਵਿੱਚ ਕਿੱਥੇ ਜਾਂਦਾ ਹੈ

ਲੋਕ ਅਕਸਰ ਰੈਗੂਲਰ ਐਕਸਪ੍ਰੈਸ਼ਨ ਉਦੋਂ ਹੀ ਸਿੱਖਦੇ ਹਨ ਜਦੋਂ ਉਹ ਕਾਫੀ ਪਰੇਸ਼ਾਨ ਹੋ ਚੁੱਕੇ ਹੁੰਦੇ ਹਨ। ਇੱਕ ਬਿਹਤਰ ਤਰੀਕਾ ਇਹ ਹੈ ਕਿ ਉਹਨਾਂ ਕੰਮਾਂ ਨੂੰ ਪਛਾਣਿਆ ਜਾਵੇ ਜੋ ਪੈਟਰਨ ਦੀ ਮੰਗ ਕਰਦੇ ਹਨ, ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕਿ ਤੁਸੀਂ ਉਹਨਾਂ 'ਤੇ ਇੱਕ ਦੁਪਹਿਰ ਬਰਬਾਦ ਕਰੋ।

ਜੇਕਰ ਤੁਹਾਨੂੰ ਦੋ ਸੌ ਪੰਨਿਆਂ ਦੇ ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਹਰ ਤਾਰੀਖ ਲੱਭਣ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਇੱਕ regex ਇੱਕੋ ਵਾਰ ਵਿੱਚ ਉਹਨਾਂ ਨੂੰ ਲੱਭ ਲਵੇਗਾ। ਜੇਕਰ ਤੁਹਾਨੂੰ ਇਹ ਜਾਂਚਣ ਦੀ ਲੋੜ ਹੈ ਕਿ ਉਪਭੋਗਤਾ ਨੇ ਅਸਲੀ URL ਟਾਈਪ ਕੀਤਾ ਹੈ ਜਾਂ ਨਹੀਂ, ਤਾਂ ਇੱਕ ਪੈਟਰਨ ਪਤੇ ਦੇ ਬੁਨਿਆਦੀ ਆਕਾਰ ਨੂੰ ਲਾਗੂ ਕਰ ਸਕਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਵੈੱਬਸਾਈਟ ਤੋਂ ਕਾਪੀ ਕੀਤੇ ਗਏ ਟੈਕਸਟ ਨੂੰ ਸਾਫ਼ ਕਰ ਰਹੇ ਹੋ ਅਤੇ ਕਈ ਸਪੇਸਾਂ ਨੂੰ ਇੱਕ ਸਪੇਸ ਵਿੱਚ ਬਦਲਣ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਇੱਕ ਰਿਪਲੇਸਮੈਂਟ regex ਸਿਰਫ਼ ਚਾਰ ਅੱਖਰ ਲੈਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਗੜਬੜ ਵਾਲੇ ਸਰਵਰ ਲੌਗਸ (server logs) ਤੋਂ ਡੇਟਾ ਕੱਢ ਰਹੇ ਹੋ, ਤਾਂ regex ਅਕਸਰ ਅਣਸੰਰਚਿਤ ਟੈਕਸਟ ਅਤੇ ਇੱਕ ਸੰਰਚਿਤ ਰਿਪੋਰਟ ਵਿਚਕਾਰ ਇੱਕੋ ਇੱਕ ਵਾਜਬ ਪੁਲ ਹੁੰਦਾ ਹੈ।

ਇੱਥੇ ਅਪਣਾਉਣ ਲਈ ਇੱਕ ਸਧਾਰਨ ਨਿਯਮ ਹੈ: ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਟੈਕਸਟ ਨੂੰ ਹੱਥ ਨਾਲ ਪੰਜਾਹ ਵਾਰ ਐਡਿਟ ਕਰਨ ਜਾ ਰਹੇ ਹੋ, ਤਾਂ ਰੁਕ ਜਾਓ। ਇਸ ਦੀ ਬਜਾਏ ਇੱਕ ਪੈਟਰਨ ਲਿਖੋ। ਮੈਨੂਅਲ ਦੁਹਰਾਓ ਨਾ ਸਿਰਫ਼ ਹੌਲੀ ਹੈ, ਸਗੋਂ ਭਰੋਸੇਯੋਗ ਵੀ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਚਾਲੀਵੇਂ ਵਾਰ ਕੁਝ ਛੱਡ ਸਕਦੇ ਹੋ ਜਾਂ ਤੀਹਵੇਂ ਵਾਰ ਕੋਈ ਗਲਤੀ ਕਰ ਸਕਦੇ ਹੋ। ਇੱਕ ਪੈਟਰਨ ਕੰਮ ਨੂੰ ਇੱਕ ਵਾਰ, ਸਹੀ ਢੰਗ ਨਾਲ ਕਰਦਾ ਹੈ, ਅਤੇ ਇਹ ਉਸ ਨਿਯਮ ਨੂੰ ਦਸਤਾਵੇਜ਼ੀ ਰੂਪ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜੋ ਤੁਸੀਂ ਸ਼ੁਰੂ ਤੋਂ ਲਾਗੂ ਕਰ ਰਹੇ ਸੀ।

ਇੱਕ ਸਿੱਖਣ ਦਾ ਚੱਕਰ ਜੋ ਕੰਮ ਕਰਦਾ ਹੈ

ਯਾਦ ਰੱਖ ਕੇ ਸੰਪੂਰਨ ਪੈਟਰਨ ਟਾਈਪ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਨਾ ਕਰੋ। ਇਸੇ ਤਰ੍ਹਾਂ ਨਿਰਾਸ਼ਾ ਵਧਦੀ ਹੈ। ਇਸ ਦੀ ਬਜਾਏ, ਇੱਕ ਸਖ਼ਤ ਚੱਕਰ (loop) ਦੀ ਪਾਲਣਾ ਕਰੋ ਜੋ ਤੁਹਾਨੂੰ ਸਿੰਟੈਕਸ ਵਿੱਚ ਗੁੰਮ ਹੋਏ ਬਿਨਾਂ ਅੱਗੇ ਵਧਦੇ ਰੱਖੇ।

  1. ਆਕਾਰ ਨੂੰ ਸ਼ਬਦਾਂ ਵਿੱਚ ਦੱਸੋ। ਕਿਸੇ ਵਿਸ਼ੇਸ਼ ਚਰਿੱਤਰ ਨੂੰ ਛੂਹਣ ਤੋਂ ਪਹਿਲਾਂ, ਲਿਖੋ ਕਿ ਤੁਸੀਂ ਬਿਲਕੁਲ ਕੀ ਚਾਹੁੰਦੇ ਹੋ। "ਚਾਰ ਅੰਕ, ਉਸ ਤੋਂ ਬਾਅਦ ਇੱਕ ਡੈਸ਼, ਉਸ ਤੋਂ ਬਾਅਦ ਦੋ ਅੰਕ, ਉਸ ਤੋਂ ਬਾਅਦ ਇੱਕ ਡੈਸ਼, ਉਸ ਤੋਂ ਬਾਅਦ ਦੋ ਅੰਕ।" ਜੇਕਰ ਤੁਸੀਂ ਇਸਨੂੰ ਸਪਸ਼ਟ ਰੂਪ ਵਿੱਚ ਨਹੀਂ ਕਹਿ ਸਕਦੇ, ਤਾਂ ਤੁਸੀਂ ਇਸਦਾ ਪੈਟਰਨ ਨਹੀਂ ਬਣਾ ਸਕਦੇ।
  2. ਪਹਿਲਾ ਡਰਾਫਟ ਤਿਆਰ ਕਰੋ। ਆਪਣੇ ਵਰਣਨ ਨੂੰ ਸਭ ਤੋਂ ਵੱਡੇ ਉਚਿਤ ਚਿੰਨ੍ਹਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ ਬੁਨਿਆਦੀ ਪੈਟਰਨ ਵਿੱਚ ਬਦਲੋ। ਸੰਪੂਰਨਤਾ ਬਾਰੇ ਚਿੰਤਾ ਨਾ ਕਰੋ। ਤੁਸੀਂ ਇੱਕ ਪ੍ਰੋਟੋਟਾਈਪ ਬਣਾ ਰਹੇ ਹੋ,