The expected value of this label
<label value="${'bye'.replace('bye','ciao')}" />
is "ciao" but the actual value is "cye".
On Windows with the same version of jdk we get the expected value.
After debugging it seems that org.zkoss.zel.BeanELResolver matches the method to invoke using method name and parameters number so getting confused by:
public String String.replace(CharSequence, CharSequence)
and
public String String.replace(Char, Char)
Since parameters are available we could use
public Method Class.getMethod(String, Class[])